/ Hex Artifact Content
Login

Artifact 3e732d2bbdd8d8d95fed0c5ae7e718d73153c4c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 20 2f 2a 20 4e 65 76  0x01      /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
7420: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
7430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7440: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7450: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7460: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7470: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7480: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7490: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
74a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
74b0: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
74c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
74d0: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
74e0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
74f0: 2f 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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7550: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7560: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7570: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7580: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7590: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
75a0: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
75b0: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
75c0: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
75d0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
75e0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
75f0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
7600: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
7610: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
7620: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
7630: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7640: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7650: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7660: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7680: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7690: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
76a0: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
76b0: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
76c0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
76d0: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
76e0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
76f0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
7700: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
7710: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
7720: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
7730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7740: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7750: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7760: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7770: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7790: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
77a0: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
77b0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
77c0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
77d0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
77e0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
77f0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
7800: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
7810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7820: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
7830: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7840: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7850: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7860: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7870: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7880: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7890: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
78a0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20  subjInMemory;   
78b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
78c0: 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72   to use in-memor
78d0: 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  y sub-journals *
78e0: 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b  /.  Pgno dbSize;
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
7910: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
7920: 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f  se */.  Pgno dbO
7930: 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
7940: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
7950: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
7960: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
7970: 20 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a    Pgno dbFileSiz
7980: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7990: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
79a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
79b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
79c0: 64 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20  dbHintSize;     
79d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
79e0: 70 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f  passed to FCNTL_
79f0: 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a  SIZE_HINT call *
7a00: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
7a30: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
7a40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  s */.  int nRec;
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72     /* Pages jour
7a70: 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73  nalled since las
7a80: 74 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74  t j-header writt
7a90: 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  en */.  u32 cksu
7aa0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
7ab0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
7ac0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
7ad0: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
7ae0: 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52  m */.  u32 nSubR
7af0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
7b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7b10: 72 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20  records written 
7b20: 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  to sub-journal *
7b30: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a  /.  Bitvec *pInJ
7b40: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7b50: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
7b60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
7b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7b80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7b90: 2a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *fd;           /
7ba0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7bb0: 72 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a  r for database *
7bc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7bd0: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
7be0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7bf0: 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72  or for main jour
7c00: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
7c10: 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20  _file *sjfd;    
7c20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7c30: 63 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d  criptor for sub-
7c40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
7c50: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
7c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7c70: 65 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74  ent write offset
7c80: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
7c90: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
7ca0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
7cb0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
7cc0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
7cd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7ce0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
7cf0: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
7d00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
7d10: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
7d20: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
7d30: 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  */.  PagerSavepo
7d40: 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b  int *aSavepoint;
7d50: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74   /* Array of act
7d60: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a  ive savepoints *
7d70: 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  /.  int nSavepoi
7d80: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
7d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
7da0: 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f  ments in aSavepo
7db0: 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20  int[] */.  char 
7dc0: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
7dd0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
7de0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
7df0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
7e00: 20 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65   */..  u8 bUseFe
7e10: 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
7e20: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
7e30: 65 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20  e xFetch() */.  
7e40: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e60: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7e70: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7e80: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7e90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ea0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
7eb0: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
7ec0: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
7ed0: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
7ee0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
7ef0: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
7f00: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
7f10: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
7f20: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7f30: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7f40: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
7f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7fa0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7fc0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7fd0: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7fe0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7ff0: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8010: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8020: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8030: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8040: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
8050: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
8060: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
8070: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
8080: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
80a0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
80b0: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
80c0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
80d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80f0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8100: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8120: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8130: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8140: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
8150: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
8160: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
8170: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
8180: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
8190: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
81a0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
81b0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
81c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
81d0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
81e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
81f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8210: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8220: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8230: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8240: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
8250: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
8260: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
8270: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
8280: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
8290: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
82a0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
82b0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
82c0: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
82d0: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
82e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
82f0: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8320: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8330: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8340: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
8350: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
8360: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
8370: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
8380: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
8390: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
83a0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
83b0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
83c0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
83d0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
83e0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
83f0: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8400: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8410: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8420: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8430: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8440: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
8450: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
8460: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
8470: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
8480: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
8490: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
84a0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
84b0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
84c0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
84d0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
84e0: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
84f0: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8500: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8510: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8520: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8530: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8540: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
8550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8560: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
8570: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
8580: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
8590: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
85a0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
85b0: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
85c0: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
85d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
85e0: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
85f0: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8600: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8610: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8620: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8630: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8640: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
8650: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
8660: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
8670: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
8680: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
8690: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
86a0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
86b0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
86c0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
86d0: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
86e0: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
86f0: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8700: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8710: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8720: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8730: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8740: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
8750: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
8760: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
8770: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
8780: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
8790: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
87a0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
87b0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
87c0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
87d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
87e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
87f0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8800: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8810: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8820: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8840: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
8850: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
8860: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8870: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
8880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8890: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
88a0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
88b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
88c0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
88d0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
88e0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
88f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8900: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8910: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8920: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8930: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8940: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
8950: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
8960: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8970: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
8980: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
8990: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
89a0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
89b0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
89c0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
89d0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
89e0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
89f0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8a00: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8a10: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8a20: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8a30: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8a40: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
8a50: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
8a60: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
8a70: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
8a80: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
8a90: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
8aa0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8ab0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8ac0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8ad0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8ae0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8af0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8b00: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8b10: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8b20: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8b30: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8b40: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
8b50: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
8b60: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
8b70: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8b80: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
8b90: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8ba0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8bb0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8bc0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8bd0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8be0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8bf0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8c00: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8c10: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8c20: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8c30: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8c40: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
8c50: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
8c60: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
8c70: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
8c80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
8c90: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
8ca0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8cb0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8cc0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8cd0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8ce0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8cf0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8d00: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8d10: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8d20: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8d30: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8d40: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8d50: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8d60: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8d70: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8d80: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8d90: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8da0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8db0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8dc0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8dd0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8de0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8df0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8e00: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8e10: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8e20: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8e30: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8e40: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8e50: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8e60: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8e70: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8e80: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8ea0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
8eb0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
8ec0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
8ed0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
8ee0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
8ef0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
8f00: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
8f10: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
8f20: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
8f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8f40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
8f50: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
8f60: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
8f70: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
8f80: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
8f90: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
8fa0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
8fb0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
8fc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
8fd0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
8fe0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
8ff0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
9000: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
9010: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
9020: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
9030: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
9040: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
9050: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
9060: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
9070: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
9080: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
9090: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
90a0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
90b0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
90c0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
90d0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
90e0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
90f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9100: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
9110: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
9120: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
9130: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
9140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
9150: 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20  cro USEFETCH is 
9160: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
9170: 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68  llowed to use th
9180: 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e  e xFetch and xUn
9190: 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61  fetch.** interfa
91a0: 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ces to access th
91b0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
91c0: 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
91d0: 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  /O..*/.#if SQLIT
91e0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
91f0: 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  0.# define USEFE
9200: 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73  TCH(x) ((x)->bUs
9210: 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20  eFetch).#else.# 
9220: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9230: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
9240: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
9250: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
9260: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
9270: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
9280: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
9290: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
92a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
92b0: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
92c0: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
92d0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
92e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
92f0: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
9300: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
9310: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
9320: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
9330: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
9340: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
9350: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
9360: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
9370: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
9380: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
9390: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
93a0: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
93b0: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
93c0: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
93d0: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
93e0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
93f0: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
9400: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
9410: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
9420: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
9430: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
9440: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
9450: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
9460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9470: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9480: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
9490: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
94a0: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
94b0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
94c0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
94d0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
94e0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
94f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9500: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
9510: 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20  x,y) 0.# define 
9520: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9530: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9540: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9550: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
9560: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
9570: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
9580: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
9590: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
95a0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
95b0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
95c0: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
95d0: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
95e0: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
95f0: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9600: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9610: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9620: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9630: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9640: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9650: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9660: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
9670: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
9680: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
9690: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
96a0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
96b0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
96c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96d0: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
96e0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
96f0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9700: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9710: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9720: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9730: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9740: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9750: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
9760: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9770: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
9780: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9790: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
97a0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
97b0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
97c0: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
97d0: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
97e0: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
97f0: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9800: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9810: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9830: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9840: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9850: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
9860: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
9870: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
9880: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
9890: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
98a0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
98b0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
98c0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
98d0: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
98f0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9900: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9910: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9920: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9930: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9940: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9960: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
9970: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9980: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
9990: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
99a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
99b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
99c0: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
99d0: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
99e0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
99f0: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9a00: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9a10: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9a20: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9a30: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9a40: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9a50: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
9a60: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
9a70: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
9a80: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
9a90: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
9aa0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
9ab0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9ac0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9ad0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9ae0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9af0: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9b00: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9b10: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9b20: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9b30: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9b40: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9b50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9b60: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
9b70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9b80: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
9b90: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
9ba0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
9bb0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9bc0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9bd0: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9be0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9bf0: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9c00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9c10: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9c20: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9c30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9c40: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9c50: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9c60: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9c70: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
9c80: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
9c90: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
9ca0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
9cb0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9cc0: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9cd0: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9ce0: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9cf0: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9d00: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9d10: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9d20: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9d30: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9d40: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9d50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d60: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9d70: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
9d80: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
9db0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9dc0: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9dd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9de0: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9df0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e10: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9e20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9e30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9e40: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9e50: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
9e60: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
9e70: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
9e80: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9e90: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
9ea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9eb0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ec0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9ed0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ee0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9ef0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9f00: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9f10: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9f20: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9f30: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e PAGER_WRITER_L
9f40: 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73  OCKED:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fd0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9fe0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
9ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a000: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a010: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a020: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a030: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a040: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a050: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a060: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a070: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a080: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a090: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a0a0: 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  ( pPager->setMas
a0b0: 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ter==0 );.      
a0c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a0d0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
a0e0: 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  CHEMOD:.      as
a0f0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a100: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a120: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a130: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a140: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a150: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a160: 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70        /* It is p
a170: 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20  ossible that if 
a180: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a190: 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68   here that neith
a1a0: 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  er the.        *
a1b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
a1c0: 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  or the WAL file 
a1d0: 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68  are open. This h
a1e0: 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20  appens during.  
a1f0: 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62        ** a rollb
a200: 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
a210: 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72  that switches fr
a220: 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  om journal_mode=
a230: 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  off.        ** t
a240: 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  o journal_mode=w
a250: 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  al..        */. 
a260: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a270: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a280: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a290: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a2a0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a2b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a2c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a2d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a2f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a300: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a310: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20  DE_WAL .        
a320: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a330: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a340: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a350: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
a360: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a370: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a380: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
a390: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a3a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a3b0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  e PAGER_WRITER_D
a3c0: 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  BMOD:.      asse
a3d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a3e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a400: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a410: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a420: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a430: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a440: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a450: 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53  p->eLock>=EXCLUS
a460: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a470: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a480: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a490: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a4a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a4b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a4c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a4d0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a4e0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a4f0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a500: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a510: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70  r->dbOrigSize<=p
a520: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a530: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a540: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a550: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
a560: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a570: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a580: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a5a0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a5b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a5c0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a5d0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a5f0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a600: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a610: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a620: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a630: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a640: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a650: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a660: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a680: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52    case PAGER_ERR
a690: 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  OR:.      /* The
a6a0: 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
a6b0: 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
a6c0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ing reference to
a6d0: 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20   the pager if.  
a6e0: 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20      ** in ERROR 
a6f0: 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
a700: 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   the pager shoul
a710: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
a720: 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20  ropped.      ** 
a730: 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
a740: 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
a750: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a760: 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
a770: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a780: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a790: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a7a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
a7b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a7c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
a7d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
a7e0: 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23  def NDEBUG */..#
a7f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a800: 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UG ./*.** Return
a810: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a820: 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73  human readable s
a830: 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69  tring in a stati
a840: 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74  c buffer.** cont
a850: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65  aining the state
a860: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
a870: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61  ject passed as a
a880: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  n argument. This
a890: 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20  .** is intended 
a8a0: 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69  to be used withi
a8b0: 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72  n debuggers. For
a8c0: 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20   example, as an 
a8d0: 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74  alternative.** t
a8e0: 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72  o "print *pPager
a8f0: 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20  " in gdb:.**.** 
a900: 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73  (gdb) printf "%s
a910: 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  ", print_pager_s
a920: 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a  tate(pPager).*/.
a930: 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69  static char *pri
a940: 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50  nt_pager_state(P
a950: 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74  ager *p){.  stat
a960: 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32  ic char zRet[102
a970: 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  4];..  sqlite3_s
a980: 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52  nprintf(1024, zR
a990: 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e  et,.      "Filen
a9a0: 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a  ame:      %s\n".
a9b0: 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20        "State:   
a9c0: 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65        %s errCode
a9d0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f  =%d\n".      "Lo
a9e0: 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c  ck:          %s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e  n".      "Lockin
aa00: 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67  g mode:  locking
aa10: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
aa20: 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a    "Journal mode:
aa30: 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25    journal_mode=%
aa40: 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b  s\n".      "Back
aa50: 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46  ing store: tempF
aa60: 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20  ile=%d memDb=%d 
aa70: 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22  useJournal=%d\n"
aa80: 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a  .      "Journal:
aa90: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66         journalOf
aaa0: 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64  f=%lld journalHd
aab0: 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20  r=%lld\n".      
aac0: 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20  "Size:          
aad0: 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67  dbsize=%d dbOrig
aae0: 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69  Size=%d dbFileSi
aaf0: 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c  ze=%d\n".      ,
ab00: 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20   p->zFilename.  
ab10: 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d      , p->eState=
ab20: 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20  =PAGER_OPEN     
ab30: 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20         ? "OPEN" 
ab40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ab50: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
ab60: 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45  R          ? "RE
ab70: 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20  ADER" :.        
ab80: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab90: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20  _WRITER_LOCKED  
aba0: 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45   ? "WRITER_LOCKE
abb0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
abc0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
abd0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20  ITER_CACHEMOD ? 
abe0: 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  "WRITER_CACHEMOD
abf0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac00: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ac10: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22  TER_DBMOD    ? "
ac20: 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a  WRITER_DBMOD" :.
ac30: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac40: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
ac50: 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54  FINISHED ? "WRIT
ac60: 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20  ER_FINISHED" :. 
ac70: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac80: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20  ==PAGER_ERROR   
ac90: 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52          ? "ERROR
aca0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
acb0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72      , (int)p->er
acc0: 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d  rCode.      , p-
acd0: 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
ace0: 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f          ? "NO_LO
acf0: 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  CK" :.        p-
ad00: 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
ad10: 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52  _LOCK   ? "RESER
ad20: 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  VED" :.        p
ad30: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
ad40: 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c  VE_LOCK  ? "EXCL
ad50: 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20  USIVE" :.       
ad60: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   p->eLock==SHARE
ad70: 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48  D_LOCK     ? "SH
ad80: 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  ARED" :.        
ad90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  p->eLock==UNKNOW
ada0: 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b  N_LOCK    ? "UNK
adb0: 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f  NOWN" : "?error?
adc0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63  ".      , p->exc
add0: 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78  lusiveMode ? "ex
ade0: 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d  clusive" : "norm
adf0: 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  al".      , p->j
ae00: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae10: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ae20: 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79  MORY   ? "memory
ae30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ae40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
ae60: 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a  F      ? "off" :
ae70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ae80: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ae90: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
aea0: 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a  E   ? "delete" :
aeb0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aec0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aed0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
aee0: 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20  ST  ? "persist" 
aef0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
af00: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af10: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
af20: 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65  CATE ? "truncate
af30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
af40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
af50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
af60: 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a  L      ? "wal" :
af70: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
af80: 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46   , (int)p->tempF
af90: 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d  ile, (int)p->mem
afa0: 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a  Db, (int)p->useJ
afb0: 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70  ournal.      , p
afc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d  ->journalOff, p-
afd0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
afe0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69    , (int)p->dbSi
aff0: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72  ze, (int)p->dbOr
b000: 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  igSize, (int)p->
b010: 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a  dbFileSize.  );.
b020: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
b030: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
b040: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
b050: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
b060: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
b070: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
b080: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
b090: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
b0a0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
b0b0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
b0c0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
b0d0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
b0e0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
b0f0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
b100: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b110: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
b120: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
b130: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
b140: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
b150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
b160: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
b170: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
b180: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
b190: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
b1a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
b1b0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
b1c0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
b1d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b1e0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
b1f0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
b200: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
b210: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
b220: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
b230: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
b240: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
b250: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
b260: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
b270: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
b280: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
b290: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
b2a0: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
b2b0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
b2c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
b2d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b2e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b2f0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
b300: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
b310: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
b320: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
b330: 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  nJournal(Pager *
b340: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
b350: 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  Pg){.  return sq
b360: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
b370: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b380: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b390: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b3a0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b3b0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b3c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b3d0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b3e0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b3f0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b400: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b410: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b420: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b430: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b440: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b450: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b460: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b470: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b480: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b490: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b4a0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b4b0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b4c0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b4d0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b4e0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b4f0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b500: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b510: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b520: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b530: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b540: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b550: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b560: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b570: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b580: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b590: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b5a0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b5b0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b5c0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b5d0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b5e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b5f0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b600: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b610: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b620: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b630: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b640: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b650: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b660: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b670: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b680: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b690: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b6a0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b6b0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b6c0: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b6d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b6e0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b6f0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b700: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b710: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b720: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b730: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b740: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b750: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b760: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b770: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b780: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b790: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b7a0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b7b0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b7c0: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b7d0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b7e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b7f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b800: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b810: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b820: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b830: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b840: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b850: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b860: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b870: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b880: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b890: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b8a0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b8b0: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b8c0: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b8d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b8e0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b8f0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b900: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b910: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b920: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b930: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b940: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b960: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b970: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b980: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b990: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b9a0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b9b0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b9c0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b9d0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
b9e0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
b9f0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
ba00: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
ba10: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
ba20: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
ba30: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
ba40: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
ba50: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
ba60: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
ba70: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
ba80: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
ba90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
baa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bab0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bac0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bad0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bae0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
baf0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bb00: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
bb10: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
bb20: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
bb30: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
bb40: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
bb50: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
bb60: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
bb70: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bb80: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bb90: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
bba0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
bbb0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
bbc0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
bbd0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
bbe0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bbf0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
bc00: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
bc10: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
bc20: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
bc30: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
bc40: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bc50: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bc60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bc70: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bc80: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
bc90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bca0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bcb0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bcc0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bcd0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bce0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bcf0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bd00: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
bd10: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
bd20: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
bd30: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
bd40: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bd50: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bd60: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
bd70: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bd80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bd90: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
bda0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bdb0: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
bdc0: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
bdd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
bde0: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bdf0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
be00: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
be10: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
be20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
be30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
be40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
be50: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
be60: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
be70: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
be80: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
be90: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
bea0: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
beb0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
bec0: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
bed0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bee0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
bef0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
bf00: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
bf10: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
bf20: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
bf30: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
bf40: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
bf50: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bf60: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
bf70: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
bf80: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
bf90: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
bfa0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
bfb0: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
bfc0: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
bfd0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
bfe0: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
bff0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c000: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c010: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c020: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c030: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c040: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c050: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c060: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c070: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c080: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c090: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c0a0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c0b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c0c0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c0d0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c0e0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c0f0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c110: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c120: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c130: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c140: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c150: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c160: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c170: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c180: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c1b0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c1c0: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c1f0: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c200: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c220: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c230: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c240: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c250: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c260: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c270: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c280: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c290: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c2a0: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c2b0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c2c0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c2d0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c2e0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c2f0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c300: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c310: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c320: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c330: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c340: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c350: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c360: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c380: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c390: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c3a0: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c3b0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c3c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c3d0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c3e0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c3f0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c400: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c410: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c420: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c430: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c440: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c450: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c460: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c470: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c480: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c490: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c4a0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c4b0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c4c0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c4d0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c4e0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c4f0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c500: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c510: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c520: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c530: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c540: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c560: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c570: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c580: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c590: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c5a0: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c5b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c5c0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c5d0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c5e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c5f0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c600: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c610: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c620: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c630: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c640: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c650: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c660: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c670: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c680: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c690: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c6a0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c6b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c6c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c6d0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c6e0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c6f0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c700: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
c710: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
c720: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
c730: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
c740: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
c750: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
c760: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
c770: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
c780: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
c790: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
c7a0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
c7b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
c7c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
c7d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
c7e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
c7f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
c800: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
c810: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
c820: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
c830: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
c840: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c850: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
c860: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
c870: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c880: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c890: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c8a0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c8b0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c8c0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c8d0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c8e0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c8f0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c900: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c920: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
c930: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
c940: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
c950: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
c960: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
c970: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
c980: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
c990: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
c9a0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
c9b0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
c9c0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
c9d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9e0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
c9f0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
ca00: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
ca10: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
ca20: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
ca30: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
ca40: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
ca50: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
ca60: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
ca70: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
ca80: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
ca90: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
caa0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
cab0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
cac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
cad0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cae0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
caf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
cb00: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
cb10: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
cb20: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
cb30: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
cb40: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
cb50: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
cb60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
cb70: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
cb80: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
cb90: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cba0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cbb0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
cbc0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cbd0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
cbe0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cbf0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cc00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cc10: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cc20: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cc30: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cc40: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cc50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cc60: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cc70: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cc80: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cc90: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cca0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ccb0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
ccc0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
ccd0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cce0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
ccf0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cd00: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
cd10: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
cd20: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
cd30: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
cd40: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cd50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cd60: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
cd70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
cd80: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
cd90: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
cda0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cdd0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cdf0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
ce00: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
ce10: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
ce20: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
ce30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
ce40: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
ce50: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
ce60: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
ce70: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
ce80: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
ce90: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
cea0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
ceb0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ced0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
cee0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
cef0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
cf00: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
cf10: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
cf20: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
cf30: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
cf40: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
cf50: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cf60: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
cf70: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
cf80: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
cf90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
cfa0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
cfb0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
cfc0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
cfd0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
cfe0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cff0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d000: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d010: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
d020: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d030: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d040: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
d050: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d060: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d070: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d080: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d090: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0a0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d0b0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d0c0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d0d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d0e0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d0f0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d100: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d110: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d120: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d130: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d140: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d150: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d160: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d170: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d180: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d190: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d1a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d1b0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d1c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d1d0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d1e0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d1f0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d200: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d210: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d220: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d230: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d240: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d250: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d260: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d270: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d280: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d290: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d2a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d2b0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d2c0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d2d0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d2e0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d2f0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d300: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d310: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d320: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d330: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d340: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d350: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d360: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d370: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d380: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d390: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d3a0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d3d0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d3f0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d460: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d470: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d480: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d490: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d4a0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d4c0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d4d0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d4e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d4f0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d500: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d510: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d520: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d530: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d540: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d550: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d560: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d570: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d580: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d590: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d5a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d5b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d5c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d5d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d5e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d5f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d600: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d610: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d620: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d630: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d640: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d650: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d660: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d670: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d680: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d690: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d6a0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d6b0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d6c0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d6d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d6e0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d6f0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d700: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d710: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d720: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d740: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d750: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d760: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d770: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d790: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d7a0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d7b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d7d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d7e0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d7f0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d800: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d810: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d820: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d830: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d840: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d850: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d860: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d870: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d880: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d890: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d8a0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d8b0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d8c0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d8d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d8e0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d8f0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d900: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d910: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d920: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d930: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d940: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d950: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d960: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d990: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d9a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d9b0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d9c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d9d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
da00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
da10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
da20: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
da30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
da40: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
da50: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
da60: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
da70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
da80: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
da90: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
daa0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
dab0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
dac0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
dad0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
dae0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
daf0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
db00: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
db10: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
db20: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
db30: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
db40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
db50: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
db60: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
db70: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
db80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
db90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dba0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
dbb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
dbc0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
dbd0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
dbe0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
dbf0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
dc00: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
dc10: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
dc20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
dc30: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
dc40: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
dc50: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
dc60: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
dc70: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
dc80: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
dc90: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
dca0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dcb0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dcd0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
dce0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
dcf0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
dd00: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
dd10: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
dd20: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
dd30: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
dd40: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
dd50: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
dd60: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
dd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dd80: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
dd90: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
dda0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ddb0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
ddc0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
ddd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dde0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
ddf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
de00: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
de10: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
de20: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
de30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
de40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
de50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
de60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
de70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
de80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
de90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
dea0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
deb0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
dec0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
ded0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dee0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
def0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
df00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
df10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
df20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
df30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
df40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
df50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
df60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
df70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
df80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
df90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dfa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
dfc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
dfd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
dff0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e000: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e010: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e020: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e030: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e040: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e050: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e060: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e070: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e080: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e090: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e0a0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e0b0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e0c0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e0d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e0e0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e100: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e110: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e120: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e130: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e140: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e150: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e160: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e170: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e180: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e190: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e1a0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e1b0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e1e0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e1f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e200: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e220: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e230: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e240: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e250: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e260: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e270: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e280: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e290: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e2a0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e2b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e2c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e2d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e2e0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e2f0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e300: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e310: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e320: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e330: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e340: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e350: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e360: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e370: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e380: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e390: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e3a0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e3b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e3c0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e3d0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e3e0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e3f0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e400: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e410: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e420: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e430: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e440: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e450: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e460: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e470: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e480: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e490: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e4a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e4b0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e4c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e4d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e4e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e4f0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e500: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e510: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e520: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e530: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e540: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e550: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e560: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e570: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e580: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e590: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e5a0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e5b0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e5c0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e5d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e5e0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e5f0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e600: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e610: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e620: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e630: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e640: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e650: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e660: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e670: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e680: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e690: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e6a0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e6b0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e6c0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e6d0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e6e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e6f0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e700: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e710: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e720: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e730: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e740: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e750: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e760: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e770: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e780: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e790: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e7a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e7b0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e7c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e7d0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e7e0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e7f0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e800: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e810: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e820: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e830: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e850: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e860: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e880: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e890: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e8a0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e8b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e8c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e8d0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e8e0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e8f0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e900: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e910: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e920: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e930: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e940: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e950: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e960: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e970: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e980: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e990: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e9a0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e9b0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e9c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e9d0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e9e0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e9f0: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
ea00: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
ea10: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
ea20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ea30: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
ea40: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
ea50: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ea60: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ea70: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
ea80: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
ea90: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
eaa0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
eab0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
eac0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ead0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
eae0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
eaf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
eb00: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
eb10: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
eb20: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
eb30: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eb40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
eb50: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
eb60: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
eb70: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
eb80: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb90: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eba0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
ebb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
ebc0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
ebd0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
ebe0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
ebf0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
ec00: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ec10: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ec20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ec30: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ec40: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ec50: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ec60: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ec70: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ec80: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ec90: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
eca0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
ecb0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
ecc0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
ecd0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ece0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
ecf0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
ed00: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
ed10: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
ed20: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
ed30: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
ed40: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
ed50: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
ed60: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
ed70: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
ed80: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ed90: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
eda0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
edb0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
edc0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
edd0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
ede0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
edf0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
ee00: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
ee10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
ee20: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ee30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ee40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ee50: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ee60: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ee70: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ee80: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ee90: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
eea0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
eeb0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
eec0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
eed0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
eee0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
eef0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
ef00: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
ef10: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
ef20: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
ef30: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
ef40: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
ef50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
ef60: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
ef70: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
ef80: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
ef90: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
efa0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
efb0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
efc0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
efd0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
efe0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
eff0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f000: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f010: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f020: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f030: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f040: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f050: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f060: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f070: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f080: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f090: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f0a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f0b0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f0c0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f0d0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f0e0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f0f0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f100: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f110: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f120: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f130: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f140: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f150: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f160: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f170: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f180: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f1b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f1c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f1d0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f1e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f1f0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f200: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f210: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f220: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f230: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f240: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f250: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f260: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f270: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f280: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f290: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f2a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f2b0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f2c0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f2d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f2e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f2f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f300: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f310: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f320: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f330: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f340: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f350: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f360: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f370: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f380: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f390: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f3a0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f3b0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f3c0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f3d0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f3e0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f3f0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f400: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f410: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f420: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f430: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f440: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f450: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f460: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f470: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f480: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f490: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f4a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f4b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f4c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f4d0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f4e0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f4f0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f500: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f510: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f520: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f530: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f540: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f550: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f560: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f570: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f580: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f590: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f5a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f5b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f5c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f5d0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f5e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f5f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f600: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f610: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f620: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f640: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f650: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f660: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f670: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f680: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f690: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f6a0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f6b0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f6c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f6e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f6f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f700: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f710: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f720: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f730: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f750: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f760: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f770: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f780: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f790: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f7a0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f7b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f7c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f7d0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f7e0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f7f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f800: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f820: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f830: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f840: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f850: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f870: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f880: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f890: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f8a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f8b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f8d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f8e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f8f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f900: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f920: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f930: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f940: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f950: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f960: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f970: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f980: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f990: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f9a0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f9b0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f9c0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f9d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f9e0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f9f0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
fa00: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
fa10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
fa20: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
fa30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fa40: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
fa50: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fa60: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fa70: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fa80: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fa90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
faa0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fab0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fac0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fad0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fae0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
faf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb00: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fb10: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fb20: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fb30: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fb40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
fb50: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fb60: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fb70: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fb80: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fb90: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fba0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fbb0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
fbc0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fbd0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fbe0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fbf0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fc00: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fc10: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fc20: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
fc30: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc40: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc60: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
fc70: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
fc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fca0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fcb0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
fcc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
fcd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
fce0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fcf0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fd00: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fd20: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fd30: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fd40: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
fd50: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
fd60: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
fd70: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fd80: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
fd90: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
fda0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fdb0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
fdc0: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
fdd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
fde0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdf0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe00: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fe10: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fe20: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fe30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fe40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fe50: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fe60: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fe70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fe80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fe90: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
fea0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
feb0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fec0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fed0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fee0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
fef0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
ff00: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
ff10: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
ff20: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
ff30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
ff40: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
ff50: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
ff60: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
ff70: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
ff80: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
ff90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
ffa0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ffb0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
ffc0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
ffd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
ffe0: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fff0: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10000 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10010 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10020 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10030 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10040 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10050 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10060 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10070 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10080 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10090 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
100a0 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
100b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
100c0 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
100f0 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10100 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10110 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10120 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10130 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10140 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10150 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10160 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10170 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10180 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10190 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
101a0 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
101b0 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
101c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
101d0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
101e0 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
101f0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10200 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10210 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10220 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10230 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10240 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10250 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10260 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10280 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
102a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
102b0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
102c0 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
102d0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
102e0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
102f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10300 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10310 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10320 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10330 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10340 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10350 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10360 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10370 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10380 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10390 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
103a0 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
103b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
103c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
103d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
103e0 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
103f0 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10400 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10410 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10420 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10430 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10440 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10450 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10460 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10470 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10480 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10490 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
104a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
104b0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
104c0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
104d0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
104e0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
104f0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10500 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10510 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10520 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10530 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10540 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10550 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10560 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10570 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10590 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
105a0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
105b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
105c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
105d0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
105e0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
105f0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10600 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10610 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10620 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10630 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10640 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10650 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10660 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10670 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10680 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10690 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
106a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
106b0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
106c0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
106d0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
106e0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
106f0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10700 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10710 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10720 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10730 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10740 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10750 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10760 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10770 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10780 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10790 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
107b0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
107c0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
107d0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10800 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10810 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10820 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10830 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10840 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10850 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10860 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10870 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10880 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10890 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
108a0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
108b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
108c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
108d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
108e0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
108f0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10900 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10910 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10920 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10950 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10970 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10980 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10990 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
109a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
109b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
109c0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
109d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
109e0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10a10 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10a20 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10a40 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10a50 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10a60 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10a70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10a80 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10a90 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10aa0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10ab0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10ac0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10ad0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10ae0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10af0 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
10b00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
10b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10b30 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10b40 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
10b50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10b60 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10b70 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10b80 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10b90 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10ba0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10bb0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10bc0 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10bd0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10be0 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10bf0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10c00 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10c10 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10c20 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10c30 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10c40 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10c50 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10c60 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10c70 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10c80 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10c90 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ca0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10cb0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10cc0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10cd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10ce0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10cf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10d00 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10d10 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10d20 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10d30 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10d40 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10d50 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10d60 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10d70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10d80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10d90 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10da0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10db0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10dc0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10dd0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10de0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10df0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10e00 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10e10 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10e20 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10e30 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10e40 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10e50 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10e60 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10e70 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10e80 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10e90 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ea0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10eb0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ec0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10ed0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10ee0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10ef0 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10f00 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10f10 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10f20 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10f30 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10f40 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10f50 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10f60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10f80 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10f90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10fa0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10fb0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10fc0 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10fd0 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10fe0 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10ff0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11000 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11010 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
11020 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
11030 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
11040 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
11050 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
11060 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
11070 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
11080 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
11090 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
110a0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
110b0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
110c0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
110d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
110e0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
110f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
11100 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
11110 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
11120 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
11130 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
11140 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
11150 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
11160 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
11170 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
11180 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
11190 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
111a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
111b0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
111c0 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
111d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
111e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
111f0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11200 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11210 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11230 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
11240 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
11250 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
11260 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e  mory page-cache.
11270 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11280 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
11290 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
112a0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
112b0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
112c0 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
112d0 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
112e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
112f0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11300 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
11310 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11320 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
11330 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
11340 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
11350 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
11360 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11370 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11380 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11390 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
113a0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
113b0 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
113c0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
113d0 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
113e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
113f0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11400 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
11410 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11420 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
11430 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
11440 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
11450 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11460 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11470 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11480 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11490 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
114a0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
114b0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
114c0 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
114d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
114e0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
114f0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11500 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11520 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11530 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
11540 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
11550 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11560 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11570 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
11580 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11590 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
115a0 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
115b0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
115c0 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
115d0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
115e0 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
115f0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11600 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11610 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11620 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11630 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
11640 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
11650 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11660 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11670 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11690 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
116a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
116b0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
116c0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
116d0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
116e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
116f0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11700 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11710 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11720 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11730 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
11740 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
11750 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
11760 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11770 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11780 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
117a0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
117b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
117c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
117d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
117e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
117f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11800 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11810 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11820 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11830 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
11840 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
11850 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
11860 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11870 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11880 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11890 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
118a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
118b0 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
118c0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
118d0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
118e0 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
118f0 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11900 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11910 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11920 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11930 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11940 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11950 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11960 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11970 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11980 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11990 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
119a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
119b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
119c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
119d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
119e0 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
119f0 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11a00 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11a10 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11a20 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11a30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11a40 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11a50 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11a60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11a70 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11a80 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11a90 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11aa0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11ab0 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11ac0 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11ad0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11ae0 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11af0 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11b00 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11b10 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11b20 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11b30 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11b40 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11b50 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11b60 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11b70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11b80 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11b90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11ba0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
11bb0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
11bc0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11bd0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
11be0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
11bf0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
11c00 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
11c10 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
11c20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
11c30 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
11c40 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
11c50 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
11c60 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
11c70 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
11c80 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
11c90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
11ca0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
11cb0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
11cc0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11cd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
11d00 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
11d10 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
11d20 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
11d30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
11d40 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
11d50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11d60 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
11d70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
11d80 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11d90 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
11da0 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
11db0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
11dc0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
11dd0 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
11de0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
11df0 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
11e00 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
11e10 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
11e20 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
11e30 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
11e40 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
11e50 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
11e60 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
11e70 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11e80 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
11e90 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11ea0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11eb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
11ec0 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
11ed0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11ee0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
11ef0 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
11f00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11f10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11f20 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
11f30 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11f40 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11f50 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
11f60 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
11f70 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11f80 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
11f90 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
11fa0 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
11fb0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
11fc0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
11fd0 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
11fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
11ff0 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12000 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12010 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12030 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12040 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12050 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
12060 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12070 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12080 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12090 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
120a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
120b0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
120c0 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
120d0 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
120e0 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
120f0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12100 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
12110 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12120 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12130 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12140 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
12150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12160 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12170 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12180 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12190 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
121a0 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
121b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
121c0 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
121d0 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
121e0 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
121f0 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12200 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
12210 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12220 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12230 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12240 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
12250 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
12260 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12270 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12290 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
122a0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
122b0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
122c0 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
122d0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
122e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
122f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12300 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
12310 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12320 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12330 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12340 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
12350 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
12360 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12370 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12380 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12390 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
123a0 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
123b0 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
123c0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
123d0 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
123e0 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
123f0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12400 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12410 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12420 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12430 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12440 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
12450 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
12460 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12470 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
12480 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
12490 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
124a0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
124b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
124c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
124d0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
124e0 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
124f0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12500 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12520 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12530 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12540 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12550 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12560 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12570 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12580 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12590 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
125a0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
125b0 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
125c0 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
125d0 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
125e0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
125f0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12600 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12610 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12620 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12630 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12640 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12650 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12660 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12670 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12680 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12690 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
126a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
126b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
126c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
126d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
126e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
126f0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12700 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12710 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12720 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12730 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12740 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12750 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12760 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12770 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12780 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12790 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
127a0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
127b0 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
127c0 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
127d0 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
127e0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
127f0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12800 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12810 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12820 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12830 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12840 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12850 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12860 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12870 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12880 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12890 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
128a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
128b0 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
128c0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
128d0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
128e0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
128f0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12900 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12910 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12920 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12940 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12950 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12970 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12980 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12990 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
129a0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
129b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
129c0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
129d0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
129e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
129f0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12a00 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12a10 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12a20 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12a40 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12a50 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12a60 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12a70 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12a80 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12a90 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12aa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12ab0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12ac0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12ad0 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12ae0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12af0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12b00 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12b10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12b20 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12b30 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12b40 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12b50 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12b60 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12b70 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12b80 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12b90 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12ba0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
12bb0 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
12bc0 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
12bd0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12be0 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
12bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
12c00 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
12c10 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
12c20 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
12c30 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
12c40 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
12c50 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
12c60 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
12c70 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
12c80 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
12c90 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
12ca0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
12cb0 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
12cc0 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
12cd0 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
12ce0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12cf0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12d00 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
12d10 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
12d20 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
12d30 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
12d40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12d50 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
12d60 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
12d70 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
12d80 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
12d90 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
12da0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
12db0 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
12dc0 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
12dd0 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
12de0 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
12df0 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
12e00 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
12e10 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
12e20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12e30 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
12e40 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
12e50 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
12e60 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
12e70 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
12e80 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
12e90 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
12ea0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
12eb0 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
12ec0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
12ed0 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
12ee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
12ef0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
12f00 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
12f10 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
12f20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
12f30 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
12f40 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
12f50 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
12f60 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12f70 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
12f80 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
12f90 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
12fa0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
12fb0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12fc0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
12fd0 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
12fe0 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
12ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13000 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13010 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13020 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13030 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13040 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
13050 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
13060 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13070 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13080 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13090 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
130a0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
130b0 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
130c0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
130d0 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
130e0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
130f0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13100 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13110 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13120 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13130 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13140 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
13150 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
13160 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13170 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13180 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13190 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
131a0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
131b0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
131c0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
131d0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
131e0 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
131f0 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13200 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13210 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13220 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13230 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13240 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
13250 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
13260 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13270 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13280 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13290 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
132a0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
132b0 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
132c0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
132d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
132e0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
132f0 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13300 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13310 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13320 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13330 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13340 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
13350 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
13360 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13370 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13380 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13390 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
133a0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
133b0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
133c0 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
133d0 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
133e0 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
133f0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13400 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13410 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13420 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13430 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13440 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
13450 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
13460 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13470 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13480 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13490 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
134a0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
134b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
134c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
134d0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
134e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
134f0 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13500 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13520 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13530 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13540 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
13550 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
13560 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13570 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13580 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13590 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
135a0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
135b0 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
135c0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
135d0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
135e0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
135f0 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13600 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13610 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13620 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13630 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13640 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13650 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13660 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13670 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13680 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13690 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
136a0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
136b0 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
136c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
136d0 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
136e0 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
136f0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13700 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13710 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13720 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13730 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13740 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13750 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13760 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13770 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13780 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13790 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
137a0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
137b0 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
137c0 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
137d0 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
137e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
137f0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13800 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13810 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13820 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13830 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13840 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13850 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13860 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13870 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13880 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13890 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
138a0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
138b0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
138c0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
138d0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
138e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
138f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13900 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13910 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13920 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13930 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13940 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13950 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13960 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13970 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13980 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13990 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
139a0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
139b0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
139c0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
139d0 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
139e0 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
139f0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
13a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13a10 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13a20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13a30 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
13a40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13a50 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
13a60 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
13a70 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a80 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a90 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
13aa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
13ab0 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
13ac0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13ad0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
13ae0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13af0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
13b00 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
13b10 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13b20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13b30 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
13b40 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13b50 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13b60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
13b70 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
13b80 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
13b90 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
13ba0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
13bb0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13bc0 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
13bd0 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
13be0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
13bf0 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
13c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13c10 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
13c20 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
13c30 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
13c40 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
13c50 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
13c60 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
13c70 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
13c80 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
13c90 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
13ca0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
13cb0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
13cc0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
13cd0 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
13ce0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
13cf0 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
13d00 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
13d10 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
13d20 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
13d30 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
13d40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13d50 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21  int bDelete = (!
13d60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13d70 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   && sqlite3Journ
13d80 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  alExists(pPager-
13d90 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73  >jfd));.      as
13da0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13db0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13dc0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13dd0 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13de0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13df0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13e00 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13e10 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13e20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13e30 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13e40 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
13e50 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13e60 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13e70 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
13e80 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
13e90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13ea0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13eb0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
13ec0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
13ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13ee0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
13ef0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
13f00 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
13f10 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
13f20 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
13f30 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
13f40 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
13f50 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
13f60 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
13f70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
13f80 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13f90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
13fa0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13fb0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13fc0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13fe0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
13ff0 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
14000 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
14010 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
14020 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
14030 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
14040 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
14050 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
14060 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
14070 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
14080 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
14090 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
140a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
140b0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
140c0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
140d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
140e0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
140f0 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
14100 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
14110 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14120 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14130 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14140 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14150 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14160 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
14170 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
14180 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14190 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
141a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
141b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
141c0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
141d0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
141e0 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
141f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
14200 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
14210 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14220 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14230 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14240 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14250 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14260 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
14270 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
14280 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
14290 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
142a0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
142b0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
142c0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
142d0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
142e0 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
142f0 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
14300 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
14310 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14320 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14330 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14340 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14350 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14360 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
14370 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
14380 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
14390 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
143a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
143b0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
143c0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
143d0 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
143e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
143f0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14400 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
14410 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
14420 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
14430 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14450 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f  & bCommit && isO
14460 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
14470 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14480 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
14490 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
144a0 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
144b0 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20  _PHASETWO, 0);. 
144c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
144d0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
144e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
144f0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
14500 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
14510 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
14520 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
14530 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
14540 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
14550 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
14560 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
14570 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
14580 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
14590 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
145a0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
145b0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
145c0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
145d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
145e0 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
145f0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
14600 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
14610 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
14620 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
14630 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
14640 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
14650 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
14660 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
14670 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
14680 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14690 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
146a0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
146b0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
146c0 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
146d0 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
146e0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
146f0 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14700 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14710 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14720 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14730 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14740 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
14750 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
14760 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
14770 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
14780 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
14790 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
147a0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
147b0 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
147c0 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
147d0 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
147e0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
147f0 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14800 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14810 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14820 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14830 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14840 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14850 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14860 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
14870 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
14880 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
14890 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
148a0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
148b0 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
148c0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
148d0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
148e0 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
148f0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14900 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14910 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14920 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14930 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14940 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
14950 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14970 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
14980 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
14990 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
149a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
149b0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
149c0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
149d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
149e0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
149f0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14a00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14a10 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14a20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14a30 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
14a50 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
14a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
14a70 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14a80 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
14a90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
14aa0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14ab0 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14ac0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14ad0 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
14ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14af0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14b00 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14b10 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14b20 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14b30 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14b40 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14b50 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
14b60 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14b70 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14b80 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14b90 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14ba0 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14bb0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14bc0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14bd0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14be0 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14bf0 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14c00 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14c10 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14c20 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14c30 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14c40 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14c50 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
14c60 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14c70 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14c80 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14c90 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14ca0 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14cb0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14cc0 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
14cd0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
14ce0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
14cf0 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
14d00 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
14d10 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
14d20 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
14d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
14d40 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
14d50 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
14d60 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
14d70 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
14d80 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
14d90 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
14da0 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
14db0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14dc0 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
14dd0 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
14de0 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
14df0 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
14e00 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
14e10 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
14e20 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
14e30 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
14e40 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
14e50 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
14e60 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
14e70 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
14e80 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
14e90 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
14ea0 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
14eb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
14ec0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
14ed0 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
14ee0 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
14ef0 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
14f00 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
14f10 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
14f20 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
14f30 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
14f40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14f50 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
14f60 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
14f70 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
14f80 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
14f90 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
14fa0 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
14fb0 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
14fc0 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
14fd0 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
14fe0 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
14ff0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
15000 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
15010 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
15020 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
15030 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
15040 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
15050 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15060 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
15070 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
15080 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
15090 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
150a0 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
150b0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
150e0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
150f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15100 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15110 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
15120 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
15130 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
15140 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15150 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
15160 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
15170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
15180 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
15190 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
151a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
151b0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
151c0 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
151d0 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
151e0 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
151f0 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
15200 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
15210 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
15220 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
15230 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
15240 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15250 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
15260 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
15270 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
15280 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
15290 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
152a0 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
152b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
152c0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
152d0 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
152e0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
152f0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15300 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
15310 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
15320 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
15330 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
15340 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
15350 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
15360 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
15370 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
15380 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
15390 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
153a0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
153b0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
153c0 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
153d0 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
153e0 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
153f0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
15400 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
15410 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
15420 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
15430 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
15440 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
15450 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
15460 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
15470 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
15480 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
15490 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
154a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
154b0 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
154c0 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
154d0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
154e0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
154f0 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
15500 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
15510 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
15520 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15530 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
15540 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
15550 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15560 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
15570 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
15580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15590 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
155a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
155b0 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
155c0 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
155d0 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
155e0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
155f0 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
15600 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
15610 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
15620 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
15630 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
15640 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
15650 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
15660 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
15670 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
15680 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
15690 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
156a0 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
156b0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
156c0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
156d0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
156e0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
156f0 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15700 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
15710 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15720 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
15730 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
15740 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15750 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
15760 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15770 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15780 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15790 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
157a0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
157b0 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
157c0 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
157d0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
157e0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
157f0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15800 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
15810 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
15820 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
15830 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
15840 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15850 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
15860 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15880 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15890 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
158a0 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
158d0 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
158e0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
158f0 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15900 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
15910 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
15920 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15930 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15950 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
15960 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15970 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15980 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15990 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
159a0 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
159b0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
159c0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
159d0 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
159e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
159f0 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15a00 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15a10 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a30 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15a40 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15a50 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
15a60 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15a70 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15a80 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15a90 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15aa0 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15ad0 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15ae0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15af0 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15b00 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15b10 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15b30 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15b40 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15b50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
15b60 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15b70 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15b80 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15b90 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15ba0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15bb0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15bc0 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15bd0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15be0 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15bf0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15c00 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15c10 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15c20 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15c30 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15c40 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15c50 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
15c60 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15c70 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15c80 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15c90 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15ca0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15cb0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15cc0 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
15cd0 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
15ce0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
15cf0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
15d00 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
15d10 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
15d20 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
15d30 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
15d40 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
15d50 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
15d60 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
15d70 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
15d80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
15d90 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15da0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
15db0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
15dc0 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
15dd0 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
15de0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15df0 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
15e00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
15e10 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
15e20 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
15e30 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
15e40 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15e50 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
15e60 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
15e70 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
15e80 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
15e90 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
15ea0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
15eb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15ec0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15ed0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
15ee0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
15ef0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
15f00 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
15f10 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
15f20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
15f30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15f40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15f50 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
15f60 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
15f70 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
15f80 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
15f90 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
15fa0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
15fb0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
15fc0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
15fd0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
15fe0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
15ff0 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
16000 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
16010 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
16020 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
16030 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16040 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
16050 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
16060 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16070 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
16080 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
16090 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
160a0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
160b0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
160c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
160d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
160e0 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
160f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
16100 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
16110 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
16120 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
16130 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
16140 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16150 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
16160 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
16170 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
16180 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
16190 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
161a0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
161b0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
161c0 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
161d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
161e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
161f0 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
16200 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
16210 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
16220 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
16230 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
16240 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
16250 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
16260 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
16270 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
16280 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
16290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
162a0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
162b0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
162c0 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
162d0 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
162e0 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
162f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16300 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
16310 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
16320 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
16330 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
16340 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
16350 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16360 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
16370 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
16380 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
16390 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
163a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
163b0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
163c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
163d0 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
163e0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
163f0 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
16400 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
16410 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
16420 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
16430 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
16440 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
16450 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
16460 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
16470 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
16480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16490 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
164a0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
164b0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
164c0 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
164d0 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
164e0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
164f0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
16500 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
16510 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
16520 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
16530 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
16540 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
16550 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
16560 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
16570 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
16580 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
16590 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
165a0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
165b0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
165c0 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
165d0 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
165e0 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
165f0 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
16600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16610 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
16620 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
16630 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
16640 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
16650 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
16660 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
16670 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
16680 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
16690 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
166a0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
166b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
166c0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
166d0 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
166e0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
166f0 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16700 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
16710 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
16720 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
16730 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
16740 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
16750 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
16760 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
16770 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
16780 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
16790 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
167a0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
167b0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
167c0 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
167d0 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
167e0 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
167f0 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16800 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
16810 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
16820 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
16830 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
16840 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
16850 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
16860 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
16870 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
16880 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
16890 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
168a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
168b0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
168c0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
168d0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
168e0 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
168f0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
16900 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
16910 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
16920 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
16930 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
16940 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
16950 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
16960 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
16970 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
16980 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16990 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
169a0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
169b0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
169c0 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
169d0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
169e0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
169f0 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16a00 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
16a10 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
16a20 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
16a30 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
16a40 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
16a50 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
16a60 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
16a70 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
16a80 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
16a90 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
16aa0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
16ab0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16ac0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16ad0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16ae0 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16af0 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16b00 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
16b10 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
16b20 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
16b30 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
16b40 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16b50 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
16b60 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
16b70 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
16b80 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
16b90 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
16ba0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
16bb0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16bc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16bd0 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16be0 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16bf0 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16c00 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
16c10 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16c20 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
16c30 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
16c40 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
16c50 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
16c60 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
16c70 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
16c80 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
16c90 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
16ca0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
16cb0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16cc0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
16cd0 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
16ce0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
16cf0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
16d00 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
16d10 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
16d20 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
16d30 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
16d40 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
16d50 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
16d60 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
16d70 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
16d80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
16d90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16da0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
16db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
16dc0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
16dd0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
16de0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
16df0 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
16e00 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
16e10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
16e20 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
16e30 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
16e40 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
16e50 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
16e60 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
16e70 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
16e80 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
16e90 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
16ea0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
16eb0 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
16ec0 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
16ed0 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
16ee0 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
16ef0 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
16f00 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
16f10 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
16f20 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
16f30 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
16f40 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
16f50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
16f60 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
16f70 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
16f80 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
16f90 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
16fa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16fb0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
16fc0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16fd0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
16fe0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16ff0 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
17000 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
17010 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
17020 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
17030 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
17040 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
17050 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
17060 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
17070 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17080 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
17090 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
170a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
170b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
170c0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
170d0 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67  u8 *)aData, pPag
170e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
170f0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
17100 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
17110 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
17120 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17130 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
17140 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
17150 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
17160 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
17170 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
17180 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
17190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
171a0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
171b0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
171c0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
171d0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
171e0 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
171f0 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
17200 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
17210 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
17220 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
17230 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17240 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17250 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17260 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
17270 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
17280 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17290 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
172a0 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
172b0 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
172c0 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
172d0 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
172e0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
172f0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17300 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17310 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17320 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17330 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17340 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17350 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17360 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
17370 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
17380 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
17390 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
173a0 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
173b0 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
173c0 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
173d0 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
173e0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
173f0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17400 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17410 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17420 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17430 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17440 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17450 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17460 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
17470 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17480 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
17490 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
174a0 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
174b0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
174c0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
174d0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
174e0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
174f0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17500 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17510 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17520 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17530 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17540 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17550 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17560 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
17570 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
17580 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
17590 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
175a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
175b0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
175c0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
175d0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
175e0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
175f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17600 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17610 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17620 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17630 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
17640 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
17650 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
17660 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
17670 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
17680 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
17690 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
176a0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
176b0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   ~SPILLFLAG_ROLL
176c0 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63  BACK;.    if( rc
176d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
176e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67  turn rc;.    pPg
176f0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
17700 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
17710 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
17720 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
17730 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
17740 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
17750 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
17760 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
17770 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
17780 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
17790 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
177a0 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
177b0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
177c0 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
177d0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
177e0 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
177f0 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
17800 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
17810 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
17820 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
17830 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
17840 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
17850 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
17860 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
17870 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
17880 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
17890 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
178a0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
178b0 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38  emcpy(pData, (u8
178c0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
178d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
178e0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
178f0 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
17900 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
17910 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
17920 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
17930 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
17940 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
17950 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
17960 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
17970 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
17980 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
17990 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
179a0 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
179b0 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
179c0 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
179d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
179e0 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
179f0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
17a00 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
17a10 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
17a20 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
17a30 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
17a40 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
17a50 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20   out to the.    
17a60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
17a70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17a80 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
17a90 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
17aa0 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
17ab0 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
17ac0 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
17ad0 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
17ae0 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
17af0 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
17b00 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
17b10 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
17b20 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
17b30 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17b40 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
17b50 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
17b60 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
17b70 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
17b80 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
17b90 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
17ba0 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
17bb0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
17bc0 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
17bd0 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
17be0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
17bf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
17c00 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
17c10 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
17c20 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
17c30 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17c40 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
17c50 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
17c60 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
17c70 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
17c80 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
17c90 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
17ca0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
17cb0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
17cc0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17cd0 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
17ce0 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
17cf0 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
17d00 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
17d10 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
17d20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17d30 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
17d40 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
17d50 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
17d60 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
17d70 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
17d80 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
17d90 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17da0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
17db0 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
17dc0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
17dd0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
17de0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ger) );.      sq
17df0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
17e00 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
17e10 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
17e20 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
17e30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
17e40 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
17e50 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
17e60 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
17e70 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
17e80 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
17e90 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
17ea0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
17eb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
17ec0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
17ed0 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
17ee0 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
17ef0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
17f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
17f10 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
17f20 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
17f30 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31  sk */.    CODEC1
17f40 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
17f50 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
17f60 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
17f70 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17f80 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
17f90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
17fb0 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
17fc0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
17fd0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
17fe0 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
17ff0 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
18000 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
18010 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18020 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
18030 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
18040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
18050 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
18060 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
18070 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18080 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
18090 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
180a0 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  s..**.** Argumen
180b0 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f  t zMaster may po
180c0 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d  int to Pager.pTm
180d0 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20  pSpace. So that 
180e0 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a  buffer is not .*
180f0 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
18100 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  use within this 
18110 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
18120 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f  When a master jo
18130 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72  urnal file is cr
18140 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70  eated, it is pop
18150 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ulated with the 
18160 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c  names .** of all
18170 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f   of its child jo
18180 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65  urnals, one afte
18190 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61  r another, forma
181a0 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a  tted as utf-8 .*
181b0 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20  * encoded text. 
181c0 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20  The end of each 
181d0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69  child journal fi
181e0 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  le is marked wit
181f0 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  h a .** nul-term
18200 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30  inator byte (0x0
18210 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74  0). i.e. the ent
18220 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
18230 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18240 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74  .** file for a t
18250 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c  ransaction invol
18260 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73  ving two databas
18270 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a  es might be:.**.
18280 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c  **   "/home/bill
18290 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /a.db-journal\x0
182a0 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62  0/home/bill/b.db
182b0 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a  -journal\x00".**
182c0 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75  .** A master jou
182d0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e  rnal file may on
182e0 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e  ly be deleted on
182f0 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  ce all of its ch
18300 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73  ild .** journals
18310 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65   have been rolle
18320 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
18330 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64  is function read
18340 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
18350 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
18360 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a  rnal file into .
18370 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f  ** memory and lo
18380 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68  ops through each
18390 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   of the child jo
183a0 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72  urnal names. For
183b0 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a  .** each child j
183c0 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b  ournal, it check
183d0 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  s if:.**.**   * 
183e0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
183f0 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64  rnal exists, and
18400 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66   if so.**   * if
18410 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18420 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65  al contains a re
18430 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65  ference to maste
18440 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  r journal .**   
18450 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a    file zMaster.*
18460 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20  *.** If a child 
18470 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
18480 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65  ound that matche
18490 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72  s both of the cr
184a0 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c  iteria.** above,
184b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
184c0 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64  eturns without d
184d0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f  oing anything. O
184e0 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20  therwise, if.** 
184f0 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f  no such child jo
18500 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
18510 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72  nd, file zMaster
18520 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
18530 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
18540 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65  tem using sqlite
18550 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
18560 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
18570 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  r within this fu
18580 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72  nction, an error
18590 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
185a0 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
185b0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65  ion allocates me
185c0 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20  mory by calling 
185d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e  sqlite3Malloc().
185e0 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   If an allocatio
185f0 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49  n.** fails, SQLI
18600 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
18610 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
18620 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c   if no IO or mal
18630 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f  loc errors .** o
18640 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ccur, SQLITE_OK 
18650 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
18660 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75  ** TODO: This fu
18670 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
18680 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20   a single block 
18690 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61  of memory to loa
186a0 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  d.** the entire 
186b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
186c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
186d0 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20  ile. This could 
186e0 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f  be.** a couple o
186f0 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73  f kilobytes or s
18700 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  o - potentially 
18710 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
18720 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a  page .** size..*
18730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
18740 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67  er_delmaster(Pag
18750 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
18760 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
18770 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
18780 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
18790 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
187c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
187d0 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20  le *pMaster;    
187e0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74  /* Malloc'd mast
187f0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18800 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
18810 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
18820 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c  ournal;   /* Mal
18830 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72  loc'd child-jour
18840 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18850 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tor */.  char *z
18860 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
18870 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
18880 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
18890 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
188a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
188b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
188c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
188d0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
188e0 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
188f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
18900 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74   one journal wit
18910 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20  hin MJ file */. 
18920 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
18930 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  r;         /* Sp
18940 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66  ace to hold MJ f
18950 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a  ilename from a j
18960 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18970 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b   int nMasterPtr;
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d             /* Am
18990 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c  ount of space al
189a0 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74  located to zMast
189b0 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  erPtr[] */..  /*
189c0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
189d0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f  for both the pJo
189e0 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65  urnal and pMaste
189f0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
18a00 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63  rs..  ** If succ
18a10 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65  essful, open the
18a20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18a30 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
18a40 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
18a50 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
18a60 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
18a70 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46  Zero(pVfs->szOsF
18a80 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
18a90 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
18aa0 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
18ab0 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
18ac0 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
18ad0 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
18ae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18af0 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
18b00 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
18b10 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18b20 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18b30 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
18b40 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
18b50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18b60 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
18b70 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
18b80 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
18b90 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18ba0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
18bb0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
18bc0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18bd0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
18be0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
18bf0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
18c00 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
18c10 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
18c20 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
18c30 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
18c40 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
18c50 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
18c60 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
18c70 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
18c80 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
18c90 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
18ca0 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
18cb0 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
18cc0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18cd0 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
18ce0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
18cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d00 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
18d10 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
18d20 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
18d30 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
18d40 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
18d50 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e  qlite3Malloc((in
18d60 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
18d70 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20   + nMasterPtr + 
18d80 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  1);.  if( !zMast
18d90 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
18da0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18db0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c  EM;.    goto del
18dc0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a  master_out;.  }.
18dd0 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
18de0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
18df0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d  MasterJournal+1]
18e00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18e10 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
18e20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
18e30 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
18e40 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  nal, 0);.  if( r
18e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18e60 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18e70 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  t;.  zMasterJour
18e80 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18e90 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75  al] = 0;..  zJou
18ea0 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
18eb0 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20  urnal;.  while( 
18ec0 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
18ed0 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
18ee0 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
18ef0 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
18f00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
18f10 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72  cess(pVfs, zJour
18f20 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
18f30 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
18f40 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ts);.    if( rc!
18f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f60 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18f70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
18f80 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
18f90 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
18fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
18fb0 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
18fc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
18fd0 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  ists..      ** O
18fe0 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
18ff0 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
19000 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19010 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  nal. If.      **
19020 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
19030 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
19040 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19050 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
19060 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
19070 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
19080 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
19090 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
190a0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
190b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
190c0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
190d0 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
190e0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
190f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19110 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19120 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
19130 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
19140 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
19150 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
19160 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
19170 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19180 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(pJournal);.   
19190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
191a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
191b0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
191c0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
191d0 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
191e0 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d  r[0]!=0 && strcm
191f0 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
19200 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
19210 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
19220 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
19230 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
19240 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
19250 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
19260 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19270 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19280 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a    }.    }.    zJ
19290 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
192a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
192b0 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20  nal)+1);.  }. . 
192c0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
192d0 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d  pMaster);.  rc =
192e0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
192f0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
19300 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  0);..delmaster_o
19310 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
19320 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
19330 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65  l);.  if( pMaste
19340 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
19350 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19360 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
19370 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20  sOpen(pJournal) 
19380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19390 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
193a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
193b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
193c0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
193d0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74  o change the act
193e0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ual size of the 
193f0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
19400 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
19410 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20  stem. This only 
19420 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d  happens when com
19430 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
19440 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c  ction,.** or rol
19450 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e  ling back a tran
19460 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69  saction (includi
19470 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ng rolling back 
19480 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
19490 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  **.** If the mai
194a0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
194b0 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
194c0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
194d0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42   in either.** DB
194e0 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  MOD or OPEN stat
194f0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
19500 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
19510 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
19520 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65   .** of the file
19530 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e   is changed to n
19540 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67  Page pages (nPag
19550 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e*pPager->pageSi
19560 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49  ze bytes). .** I
19570 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
19580 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  sk is currently 
19590 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67  larger than nPag
195a0 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73  e pages, then us
195b0 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72  e the VFS.** xTr
195c0 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
195d0 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a  to truncate it..
195e0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67  **.** Or, it mig
195f0 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  ht might be the 
19600 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
19610 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
19620 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
19630 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
19640 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
19650 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
19660 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
19670 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
19680 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
19690 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
196a0 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
196b0 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
196c0 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
196d0 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
196e0 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
196f0 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
19700 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
19710 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
19720 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
19730 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
19740 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
19750 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
19760 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
19770 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19780 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
19790 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
197a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
197b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
197c0 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
197d0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
197e0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
197f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
19800 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19810 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
19820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19830 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
19840 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
19850 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
19860 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26  ager->fd) .   &&
19870 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
19880 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
19890 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
198a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
198b0 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36  EN) .  ){.    i6
198c0 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
198d0 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  ewSize;.    int 
198e0 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
198f0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  >pageSize;.    a
19900 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19910 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
19920 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54  LOCK );.    /* T
19930 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
19940 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
19950 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
19960 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19970 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
19980 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
19990 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
199a0 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34  ze = szPage*(i64
199b0 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
199c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
199d0 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
199e0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
199f0 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
19a00 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
19a10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19a20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
19a30 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
19a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
19a50 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61  currentSize+szPa
19a60 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ge)<=newSize ){.
19a70 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54          char *pT
19a80 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  mp = pPager->pTm
19a90 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
19aa0 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20  memset(pTmp, 0, 
19ab0 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  szPage);.       
19ac0 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
19ad0 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
19ae0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
19af0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19b00 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19b10 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
19b20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19b30 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
19b40 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
19b50 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
19b60 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
19b70 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
19b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
19ba0 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
19bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19bc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19be0 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73  a sanitized vers
19bf0 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ion of the secto
19c00 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c  r-size of OS fil
19c10 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  e pFile. The.** 
19c20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
19c30 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69  guaranteed to li
19c40 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64  e between 32 and
19c50 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19c60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19c70 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
19c80 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
19c90 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71  .  int iRet = sq
19ca0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
19cb0 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(pFile);.  if( 
19cc0 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69  iRet<32 ){.    i
19cd0 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  Ret = 512;.  }el
19ce0 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f  se if( iRet>MAX_
19cf0 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
19d00 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
19d10 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
19d20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41  );.    iRet = MA
19d30 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
19d40 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
19d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19d60 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19d70 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
19d80 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
19d90 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
19da0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
19db0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19dc0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
19dd0 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
19de0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
19df0 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
19e00 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
19e10 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
19e20 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
19e30 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
19e40 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
19e50 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
19e60 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
19e70 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
19e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
19e90 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
19ea0 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
19eb0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
19ec0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
19ed0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
19ee0 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
19ef0 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
19f00 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
19f10 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
19f20 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
19f30 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19f40 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
19f50 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
19f60 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
19f70 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
19f80 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
19f90 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
19fa0 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
19fb0 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
19fc0 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49  OR_SIZE..**.** I
19fd0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74  f the file has t
19fe0 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
19ff0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1a000 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68  ITE property, th
1a010 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66  en set.** the ef
1a020 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a030 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ize to its minim
1a040 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20  um value (512). 
1a050 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a   The purpose of.
1a060 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ** pPager->secto
1a070 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69  rSize is to defi
1a080 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61  ne the "blast ra
1a090 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74  dius" of bytes t
1a0a0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1a0b0 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f  nge if a crash o
1a0c0 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74  ccurs while writ
1a0d0 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
1a0e0 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20  byte in.** that 
1a0f0 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68  range.  But with
1a100 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1a110 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20  RITE, the blast 
1a120 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a  radius is zero.*
1a130 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20  * (that is what 
1a140 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1a150 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77  ITE means), so w
1a160 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73  e minimize the s
1a170 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20  ector.** size.  
1a180 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
1a190 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74  mpatibility of t
1a1a0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1a1b0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  nal file format,
1a1c0 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65  .** we cannot re
1a1d0 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1a1e0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62  ve sector size b
1a1f0 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  elow 512..*/.sta
1a200 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
1a210 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
1a220 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
1a230 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a240 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1a250 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
1a260 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1a270 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  le.   || (sqlite
1a280 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1a290 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1a2a0 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20  >fd) & .        
1a2b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1a2c0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1a2d0 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a  RWRITE)!=0.  ){.
1a2e0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
1a2f0 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
1a300 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
1a310 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
1a320 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
1a330 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
1a340 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
1a350 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
1a360 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1a370 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
1a380 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50  fault. */.    pP
1a390 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a3a0 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b   = 512;.  }else{
1a3b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1a3c0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
1a3d0 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  3SectorSize(pPag
1a3e0 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  er->fd);.  }.}..
1a3f0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
1a400 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
1a410 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
1a420 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1a430 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
1a440 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
1a450 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
1a460 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
1a470 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1a480 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
1a490 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
1a4a0 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
1a4b0 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
1a4c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
1a4d0 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
1a4e0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a4f0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a500 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
1a510 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
1a520 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
1a530 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
1a540 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1a550 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
1a560 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
1a570 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
1a580 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
1a590 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
1a5a0 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
1a5b0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a5c0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
1a5d0 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
1a5e0 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
1a5f0 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
1a600 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
1a610 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a620 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1a630 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
1a640 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
1a650 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
1a660 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
1a670 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
1a680 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a690 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
1a6a0 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
1a6b0 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
1a6c0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1a6d0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
1a6e0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a6f0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a700 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69  h is the page si
1a710 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72  ze..**  (7)  zer
1a720 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f  o padding out to
1a730 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
1a740 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20   size..**  (8)  
1a750 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
1a760 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
1a770 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
1a780 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1a790 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
1a7a0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
1a7b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1a7c0 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
1a7d0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1a7e0 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
1a7f0 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
1a800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1a810 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
1a820 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61   first 7 items a
1a830 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
1a840 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
1a850 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
1a860 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65  e of the 8th ite
1a870 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
1a880 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
1a890 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
1a8a0 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
1a8b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
1a8c0 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
1a8d0 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
1a8e0 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
1a8f0 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
1a900 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
1a910 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
1a920 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1a930 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
1a940 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
1a950 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
1a960 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
1a970 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
1a980 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
1a990 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
1a9a0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1a9b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1a9c0 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
1a9d0 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
1a9e0 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
1a9f0 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
1aa00 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
1aa10 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
1aa20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
1aa30 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
1aa40 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
1aa50 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
1aa60 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
1aa70 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
1aa80 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1aa90 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1aaa0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
1aab0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
1aac0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1aad0 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
1aae0 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
1aaf0 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
1ab00 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
1ab10 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
1ab20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
1ab30 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
1ab40 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
1ab50 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1ab60 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
1ab70 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
1ab80 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
1ab90 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
1aba0 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
1abb0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1abc0 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
1abd0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
1abe0 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
1abf0 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
1ac00 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
1ac10 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
1ac20 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
1ac30 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
1ac40 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
1ac50 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1ac60 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
1ac70 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
1ac80 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
1ac90 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
1aca0 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
1acb0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1acc0 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
1acd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1ace0 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
1acf0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1ad00 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
1ad10 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
1ad20 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
1ad30 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
1ad40 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
1ad50 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1ad60 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
1ad70 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
1ad80 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
1ad90 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1ada0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
1adb0 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
1adc0 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
1add0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
1ade0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
1adf0 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
1ae00 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
1ae10 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
1ae20 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
1ae30 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
1ae40 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
1ae50 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
1ae60 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
1ae70 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
1ae80 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1ae90 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
1aea0 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
1aeb0 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
1aec0 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
1aed0 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
1aee0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
1aef0 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
1af00 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
1af10 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
1af20 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
1af30 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1af40 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
1af50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1af60 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1af70 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af90 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
1afa0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
1afb0 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
1afc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1afd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
1afe0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
1aff0 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1b020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1b030 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
1b040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b050 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1b060 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
1b070 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b090 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
1b0a0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
1b0b0 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
1b0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1b0d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b0e0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1b0f0 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
1b100 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
1b110 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
1b120 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1b130 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
1b140 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
1b150 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
1b160 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
1b170 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
1b180 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
1b190 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20  nPlayback = 0;  
1b1a0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1b1b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
1b1c0 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72  stored from jour
1b1d0 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  nal */..  /* Fig
1b1e0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1b1f0 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1b200 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1b210 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1b220 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1b230 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1b240 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1b250 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1b260 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1b270 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1b280 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1b290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b2a0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b2b0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1b2c0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1b2d0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1b2e0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1b2f0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1b300 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1b310 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b320 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1b330 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1b340 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1b350 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1b360 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1b370 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1b380 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1b390 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1b3a0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1b3b0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1b3c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1b3d0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1b3e0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1b3f0 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1b400 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1b410 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1b420 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1b430 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1b440 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1b450 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1b460 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1b470 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1b480 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
1b490 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1b4a0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1b4b0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1b4c0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1b4d0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1b4e0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1b4f0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1b500 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1b510 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1b520 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1b530 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1b540 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1b550 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b560 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1b570 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1b580 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1b590 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1b5a0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1b5b0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1b5c0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1b5d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b5e0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1b5f0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b600 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1b610 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1b620 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1b630 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1b640 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1b650 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1b660 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1b670 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1b680 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1b690 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1b6a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1b6b0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1b6c0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1b6d0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1b6e0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1b6f0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1b700 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1b710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1b720 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1b730 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1b740 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1b750 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1b760 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1b770 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1b780 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1b790 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1b7a0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1b7b0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1b7c0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1b7d0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1b7e0 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1b7f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1b800 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1b810 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1b820 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1b830 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1b840 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b850 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1b860 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1b870 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1b880 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b890 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1b8a0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b8b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b8c0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1b8d0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1b8e0 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1b8f0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1b900 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1b910 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1b920 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1b930 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1b940 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1b950 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1b960 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1b970 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1b980 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1b990 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1b9a0 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1b9b0 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1b9c0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1b9d0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1b9e0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1b9f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1ba00 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1ba10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1ba20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1ba30 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1ba40 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1ba50 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1ba60 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1ba70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1ba80 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1ba90 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1baa0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1bab0 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1bac0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1bad0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1bae0 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1baf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1bb00 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1bb10 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1bb20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1bb30 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1bb40 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1bb50 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1bb60 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1bb70 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1bb80 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1bb90 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1bba0 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1bbb0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1bbc0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1bbd0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1bbe0 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1bbf0 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1bc00 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1bc10 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1bc20 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1bc30 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1bc40 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1bc50 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1bc60 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1bc70 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1bc80 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1bc90 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1bca0 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1bcb0 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1bcc0 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1bcd0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1bce0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1bcf0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1bd00 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1bd10 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1bd20 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1bd30 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1bd40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1bd50 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1bd60 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1bd70 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1bd80 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1bd90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1bda0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1bdb0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1bdc0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1bdd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bde0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1bdf0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1be00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1be10 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1be20 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1be30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1be40 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1be50 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1be60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1be70 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1be80 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1be90 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1bea0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1beb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1bec0 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1bed0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1bee0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1bef0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1bf00 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bf10 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1bf20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1bf30 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1bf40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bf50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1bf60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1bf70 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1bf80 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1bf90 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1bfa0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1bfb0 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1bfc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1bfd0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1bfe0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1bff0 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1c000 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1c010 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1c020 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1c030 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1c040 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1c050 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1c060 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1c070 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1c080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1c090 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1c0a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1c0b0 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1c0c0 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1c0d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c0e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c0f0 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1c100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c120 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1c130 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1c140 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1c150 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c160 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1c180 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1c190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c1a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1c1b0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1c1c0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1c1d0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1c1e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1c1f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1c200 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1c210 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1c220 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1c230 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1c240 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1c250 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1c260 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1c270 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1c280 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1c290 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1c2a0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1c2b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1c2c0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1c2d0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1c2e0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1c2f0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1c300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c310 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1c320 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c330 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c350 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1c360 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1c370 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1c380 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1c390 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1c3a0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1c3b0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1c3c0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1c3d0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1c3e0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1c3f0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1c400 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1c410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1c420 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1c430 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1c440 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1c450 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1c460 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c470 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c480 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1c490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c4a0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1c4b0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1c4c0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1c4d0 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1c4e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1c4f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1c500 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1c510 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1c520 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1c530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1c540 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1c550 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1c560 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1c570 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1c580 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1c590 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1c5a0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1c5b0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c5c0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1c5d0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66  dified..  */.#if
1c5e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1c5f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
1c600 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1c610 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
1c620 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
1c630 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1c640 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1c650 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ,0);.  }.#endif.
1c660 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
1c670 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
1c680 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
1c690 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
1c6a0 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
1c6b0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
1c6c0 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
1c6d0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1c6e0 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1c6f0 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
1c700 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c710 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
1c720 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
1c730 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
1c740 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
1c750 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
1c760 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
1c770 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
1c780 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
1c790 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
1c7a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
1c7b0 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
1c7c0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
1c7d0 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
1c7e0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1c7f0 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
1c800 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
1c810 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
1c820 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
1c830 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1c840 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
1c850 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
1c860 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
1c870 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
1c880 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
1c890 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1c8a0 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
1c8b0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1c8c0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1c8d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1c8e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c8f0 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
1c900 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1c910 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
1c920 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1c930 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1c940 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1c950 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1c960 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
1c970 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1c980 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1c990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
1c9a0 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1c9b0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1c9c0 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1c9d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1c9e0 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1c9f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1ca00 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ync(pPager, 0);.
1ca10 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1ca20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1ca30 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1ca40 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1ca50 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1ca60 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1ca70 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1ca80 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1ca90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1caa0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1cab0 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1cac0 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1cad0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1cae0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1caf0 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1cb00 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1cb10 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1cb20 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1cb30 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1cb40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1cb50 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1cb60 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1cb70 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1cb80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cb90 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26  }.  if( isHot &&
1cba0 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20   nPlayback ){.  
1cbb0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
1cbc0 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
1cbd0 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72  VER_ROLLBACK, "r
1cbe0 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65  ecovered %d page
1cbf0 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20  s from %s",.    
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61              nPla
1cc10 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a  yback, pPager->z
1cc20 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20  Journal);.  }.. 
1cc30 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1cc40 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1cc50 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1cc60 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1cc70 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1cc80 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1cc90 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1cca0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1ccb0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1ccc0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1ccd0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1cce0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1ccf0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1cd00 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1cd10 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1cd20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1cd30 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1cd40 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1cd50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1cd60 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1cd70 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1cd80 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1cd90 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1cda0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1cdb0 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1cdc0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1cdd0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1cde0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1cdf0 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1ce00 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1ce10 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1ce20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1ce30 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1ce40 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ce50 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1ce60 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1ce70 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1ce80 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1ce90 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1cea0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1ceb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1cec0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1ced0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c  Page(PgHdr *pPg,
1cee0 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20   u32 iFrame){.  
1cef0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1cf00 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
1cf10 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
1cf20 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1cf30 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
1cf40 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
1cf50 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
1cf60 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
1cf70 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1cf80 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1cf90 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1cfa0 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
1cfb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1cfc0 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ; /* Number of b
1cfd0 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
1cfe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1cff0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1d000 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1d010 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1d020 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1d030 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1d040 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1d050 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20  if( iFrame ){.  
1d060 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1d070 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1d080 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1d090 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1d0a0 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72  sqlite3WalReadFr
1d0b0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1d0c0 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20  , iFrame, pgsz, 
1d0d0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
1d0e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1d0f0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1d100 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1d110 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d120 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1d130 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1d140 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1d150 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1d160 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d170 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1d180 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1d190 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d1a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1d1b0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1d1c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1d1d0 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1d1e0 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1d1f0 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1d200 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1d210 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1d220 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1d230 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1d240 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1d250 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1d260 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1d270 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1d280 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1d290 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1d2a0 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1d2b0 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1d2c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1d2d0 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1d2e0 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1d2f0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1d300 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1d310 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1d320 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1d330 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1d340 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d350 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1d360 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1d370 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1d380 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1d390 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1d3a0 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1d3b0 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1d3c0 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1d3d0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1d3e0 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1d3f0 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1d400 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1d410 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1d420 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
1d430 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1d440 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1d450 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1d460 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1d470 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1d480 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1d490 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1d4a0 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1d4b0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1d4c0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1d4d0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1d4e0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1d4f0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1d500 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1d510 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1d520 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1d530 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1d540 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1d550 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1d560 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1d570 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1d580 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1d590 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1d5a0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1d5b0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1d5c0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1d5d0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1d5e0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1d5f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1d600 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1d610 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1d620 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1d630 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d640 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1d650 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1d660 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1d670 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1d680 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1d690 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1d6a0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1d6b0 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e  at offsets 24 an
1d6c0 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68  d 92 in.** the h
1d6d0 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71  eader and the sq
1d6e0 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  lite version num
1d6f0 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
1d700 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1d710 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  an unconditional
1d720 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c   update.  See al
1d730 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63  so the pager_inc
1d740 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1d750 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69  ).** routine whi
1d760 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20  ch only updates 
1d770 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d780 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65  er if the update
1d790 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20   is actually.** 
1d7a0 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72  needed, as deter
1d7b0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61  mined by the pPa
1d7c0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1d7d0 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61  Done state varia
1d7e0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1d7f0 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f  oid pager_write_
1d800 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67  changecounter(Pg
1d810 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32  Hdr *pPg){.  u32
1d820 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1d830 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1d840 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1d850 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1d860 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1d870 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1d880 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1d890 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1d8a0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  g->pPager->dbFil
1d8b0 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33  eVers)+1;.  put3
1d8c0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1d8d0 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  g->pData)+24, ch
1d8e0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1d8f0 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
1d900 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
1d910 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
1d920 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
1d930 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e  .  ** bytes 92..
1d940 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61  95 store the cha
1d950 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1d960 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f  which the versio
1d970 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73  n number.  ** is
1d980 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74   valid. */.  put
1d990 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1d9a0 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  Pg->pData)+92, c
1d9b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1d9c0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1d9d0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1d9e0 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
1d9f0 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23  ON_NUMBER);.}..#
1da00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1da10 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
1da20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1da30 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
1da40 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
1da50 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
1da60 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
1da70 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
1da80 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
1da90 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1daa0 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
1dab0 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
1dac0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
1dad0 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
1dae0 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
1daf0 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
1db00 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1db10 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1db20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
1db30 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
1db40 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
1db50 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1db60 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
1db70 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
1db80 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
1db90 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1dba0 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
1dbb0 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
1dbc0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
1dbd0 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
1dbe0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
1dbf0 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
1dc00 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
1dc10 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1dc20 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
1dc30 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
1dc40 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1dc50 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
1dc60 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1dc70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1dc80 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
1dc90 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
1dca0 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
1dcb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1dcc0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1dcd0 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
1dce0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
1dcf0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1dd00 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  l(pPager) );.  p
1dd10 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1dd20 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1dd30 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1dd40 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1dd50 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1dd60 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1dd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1dd80 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1dd90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1dda0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20  32 iFrame = 0;. 
1ddb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ddc0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
1ddd0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d  ager->pWal, pPg-
1dde0 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b  >pgno, &iFrame);
1ddf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1de00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de10 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1de20 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
1de30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1de40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1de50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1de60 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1de70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1de80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1de90 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
1dea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1deb0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1dec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ded0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1dee0 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1def0 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1df00 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1df10 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1df20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1df30 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1df40 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1df50 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1df60 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1df70 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1df80 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1df90 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1dfa0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1dfb0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1dfc0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1dfd0 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1dfe0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1dff0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1e000 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1e010 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1e020 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1e030 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1e040 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1e050 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1e060 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1e070 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1e080 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1e090 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1e0a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1e0b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e0c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e0d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1e0e0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1e0f0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1e100 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1e110 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e120 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1e130 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e140 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e160 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1e170 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1e1a0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1e1b0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1e1c0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1e1d0 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1e1e0 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1e1f0 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1e200 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1e210 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1e220 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1e230 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1e240 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1e250 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1e260 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1e270 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1e280 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1e290 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1e2a0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1e2b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e2c0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1e2d0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1e2e0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1e2f0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1e300 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1e310 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1e320 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e330 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1e340 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1e350 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1e360 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1e370 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1e380 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1e390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1e3a0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1e3b0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1e3c0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1e3d0 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1e3e0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1e3f0 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1e400 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1e410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e420 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e430 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1e440 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1e450 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1e460 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1e470 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1e480 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1e490 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1e4a0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1e4b0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1e4c0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1e4d0 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1e4e0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1e4f0 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1e500 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1e510 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1e520 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1e530 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1e540 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1e550 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1e560 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1e570 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1e580 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1e590 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1e5a0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1e5b0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1e5c0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1e5d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1e600 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1e610 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1e620 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e630 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1e640 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1e650 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1e660 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1e670 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1e680 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1e690 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1e6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e6b0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e6c0 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1e6d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e6f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e700 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e730 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1e740 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1e750 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1e760 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1e770 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1e780 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e7a0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1e7b0 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1e7c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1e7d0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1e7e0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1e7f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1e800 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1e810 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1e820 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1e830 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1e840 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1e850 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1e860 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1e870 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1e880 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1e890 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1e8a0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1e8b0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1e8c0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1e8d0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1e8e0 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1e8f0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1e900 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1e910 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1e920 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1e930 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1e940 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1e950 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1e960 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1e970 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1e980 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1e990 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1e9a0 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1e9b0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1e9c0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1e9d0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1e9e0 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  p;.    PgHdr **p
1e9f0 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1ea00 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1ea10 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1ea20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1ea30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ea40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1ea50 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1ea60 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1ea70 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1ea80 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1ea90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1eaa0 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1eab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1eac0 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1ead0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1eae0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1eaf0 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1eb00 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1eb10 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1eb20 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1eb30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1eb40 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1eb50 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1eb60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1eb70 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1eb80 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1eb90 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1eba0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1ebb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ebc0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1ebd0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1ebe0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1ebf0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1ec00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1ec10 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1ec20 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1ec30 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1ec40 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1ec50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ec60 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1ec70 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1ec80 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1ec90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1eca0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1ecb0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1ecc0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1ecd0 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1ece0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1ecf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1ed00 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1ed10 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1ed20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ed30 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1ed40 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1ed50 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1ed60 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1ed70 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1ed80 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1ed90 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1eda0 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1edb0 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1edc0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1edd0 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1ede0 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1edf0 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1ee00 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1ee10 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1ee20 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1ee30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ee40 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1ee50 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1ee60 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1ee70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ee90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1eea0 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eec0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1eed0 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1eee0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1eef0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1ef00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1ef10 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1ef20 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1ef30 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1ef40 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1ef50 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1ef60 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1ef70 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1ef80 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1ef90 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1efa0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1efb0 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1efc0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1efd0 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1efe0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1eff0 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1f000 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1f010 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1f020 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1f030 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1f040 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1f050 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1f060 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f070 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f080 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1f090 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1f0a0 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1f0b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f0c0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1f0d0 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1f0e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1f0f0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
1f100 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
1f110 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
1f120 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
1f130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f140 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1f150 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f160 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
1f170 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
1f180 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
1f190 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
1f1a0 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
1f1b0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
1f1c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f1d0 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
1f1e0 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
1f1f0 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
1f200 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
1f210 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
1f220 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
1f230 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
1f240 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1f250 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f260 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
1f270 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
1f280 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
1f290 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
1f2a0 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
1f2b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f2c0 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
1f2d0 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1f2e0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
1f2f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f300 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
1f310 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1f320 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
1f330 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1f340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f350 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1f360 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1f370 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
1f380 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
1f390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f3a0 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
1f3b0 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
1f3c0 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
1f3d0 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
1f3e0 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
1f3f0 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
1f400 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
1f410 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
1f420 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
1f430 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f440 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
1f450 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1f460 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
1f470 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
1f480 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
1f490 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
1f4a0 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
1f4b0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
1f4c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f4d0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f4e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f4f0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1f500 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61  ED_LOCK );.  nPa
1f510 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
1f520 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1f530 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
1f540 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f550 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  was not availabl
1f560 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1f570 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20  ub-system,.  ** 
1f580 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73  determine it bas
1f590 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
1f5a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f5b0 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65  ile. If the size
1f5c0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  .  ** of the dat
1f5d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
1f5e0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c  t an integer mul
1f5f0 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
1f600 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75  e-size,.  ** rou
1f610 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e  nd down to the n
1f620 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78 63  earest page. Exc
1f630 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61  ept, any file la
1f640 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a  rger than 0.  **
1f650 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69   bytes in size i
1f660 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
1f670 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74  contain at least
1f680 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a   one page..  */.
1f690 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1f6a0 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  {.    i64 n = 0;
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
1f6d0 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  b file in bytes 
1f6e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
1f6f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1f700 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1f710 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1f720 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1f730 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fd) ){.      int
1f740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1f750 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1f760 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69  fd, &n);.      i
1f770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f780 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1f790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1f7a0 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d     }.    nPage =
1f7b0 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65   (Pgno)((n+pPage
1f7c0 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f  r->pageSize-1) /
1f7d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1f7e0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
1f7f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1f800 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1f810 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1f820 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ter than the.  *
1f830 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
1f840 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
1f850 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
1f860 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
1f870 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
1f880 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
1f890 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1f8a0 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
1f8b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1f8c0 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
1f8d0 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e  Page;.  }..  *pn
1f8e0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1f8f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f900 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1f910 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1f920 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
1f930 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20  *-wal file that 
1f940 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
1f950 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1f960 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20  ed by pPager.** 
1f970 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61  exists if the da
1f980 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
1f990 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68  py, or verify th
1f9a0 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  at the *-wal fil
1f9b0 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  e does.** not ex
1f9c0 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67  ist (by deleting
1f9d0 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61   it) if the data
1f9e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70  base file is emp
1f9f0 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
1fa00 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
1fa10 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a   empty and the *
1fa20 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1fa30 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72  , open the pager
1fa40 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  .** in WAL mode.
1fa50 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1fa60 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66  e is empty or if
1fa70 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65   no *-wal file e
1fa80 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20  xists and.** if 
1fa90 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1faa0 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72   make sure Pager
1fab0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20  .journalMode is 
1fac0 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41  not set to.** PA
1fad0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1fae0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  WAL..**.** Retur
1faf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61  n SQLITE_OK or a
1fb00 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  n error code..**
1fb10 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1fb20 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45  ust hold a SHARE
1fb30 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
1fb40 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
1fb50 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  all this.** func
1fb60 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e  tion. Because an
1fb70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1fb80 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69  on the db file i
1fb90 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65  s required to de
1fba0 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f  lete .** a WAL o
1fbb0 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64  n a none-empty d
1fbc0 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e  atabase, this en
1fbd0 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e  sures there is n
1fbe0 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  o race condition
1fbf0 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65   .** between the
1fc00 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77   xAccess() below
1fc10 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28   and an xDelete(
1fc20 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64  ) being executed
1fc30 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68   by some .** oth
1fc40 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  er connection..*
1fc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fc60 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
1fc70 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1fc80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1fc90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1fca0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1fcb0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1fcc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fcd0 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1fce0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  _LOCK );..  if( 
1fcf0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1fd00 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57  e ){.    int isW
1fd10 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1fd20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fd30 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74  f WAL file exist
1fd40 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50  s */.    Pgno nP
1fd50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1fd60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1fd70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1fd80 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
1fd90 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1fda0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1fdb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1fdc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
1fdd0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1fde0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fdf0 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
1fe00 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
1fe10 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  al, 0);.      if
1fe20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1fe30 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
1fe40 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
1fe50 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1fe60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1fe70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fe80 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1fe90 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1fea0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1feb0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1fec0 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1fed0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1fee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fef0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1ff00 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1ff10 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1ff20 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1ff30 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1ff40 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1ff50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ff60 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1ff70 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1ff80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1ff90 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1ffa0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
1ffb0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1ffc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
1ffd0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1ffe0 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
1fff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
20000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
20010 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
20020 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
20030 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
20040 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
20050 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
20060 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
20070 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20080 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
20090 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
200a0 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
200b0 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
200c0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
200d0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
200e0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
200f0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
20100 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
20110 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
20120 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
20130 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
20140 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
20150 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
20160 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
20170 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
20180 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
20190 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
201a0 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
201b0 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
201c0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
201d0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
201e0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
201f0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
20200 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
20210 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20220 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
20230 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
20240 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20250 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
20260 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
20270 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
20280 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
20290 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
202a0 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
202b0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
202c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
202d0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
202e0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
202f0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
20300 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
20310 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
20320 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
20330 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
20340 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
20350 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
20360 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
20370 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
20380 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
20390 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
203a0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
203b0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
203c0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
203d0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
203e0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
203f0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
20400 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
20410 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
20420 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
20430 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
20440 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
20450 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
20460 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
20470 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
20480 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
20490 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
204a0 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
204b0 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
204c0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
204d0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
204e0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
204f0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
20500 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
20510 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
20520 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
20530 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
20540 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
20550 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
20560 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
20570 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
20580 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
20590 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
205a0 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
205b0 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
205c0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
205d0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
205e0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
205f0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
20600 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
20610 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
20620 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
20630 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
20640 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
20650 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
20660 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
20670 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
20680 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
20690 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
206a0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
206b0 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
206c0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
206d0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
206e0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
206f0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
20700 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
20710 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
20720 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
20730 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20750 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
20760 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
20770 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
20780 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
20790 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
207a0 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
207b0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
207c0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
207d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
207e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
207f0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
20800 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
20810 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
20820 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
20830 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
20840 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
20850 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
20860 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
20870 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20880 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
20890 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
208a0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
208b0 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
208c0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
208d0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
208e0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
208f0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
20900 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
20910 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
20920 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
20930 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
20940 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20950 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
20960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
20970 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20980 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
20990 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
209a0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
209b0 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
209c0 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
209d0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
209e0 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
209f0 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
20a00 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
20a10 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
20a20 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
20a30 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
20a40 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
20a50 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
20a60 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20a70 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
20a80 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
20a90 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
20aa0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
20ab0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
20ac0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
20ad0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
20ae0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
20af0 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
20b00 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
20b10 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
20b20 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
20b30 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
20b40 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
20b50 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
20b60 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
20b70 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
20b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
20b90 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
20ba0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
20bb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20bc0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
20bd0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20be0 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
20bf0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
20c00 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
20c10 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
20c20 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20c30 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
20c40 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
20c50 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
20c60 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
20c70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
20c80 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
20c90 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
20ca0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
20cb0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
20cc0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
20cd0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
20ce0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
20cf0 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
20d00 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
20d10 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
20d20 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
20d30 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
20d40 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
20d50 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
20d60 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
20d70 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
20d80 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
20d90 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
20da0 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
20db0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
20dc0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
20dd0 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
20de0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
20df0 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
20e00 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
20e10 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20e20 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
20e30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
20e40 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
20e50 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20e60 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20e70 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
20e80 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
20e90 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20ea0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20eb0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
20ec0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
20ed0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
20ee0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
20ef0 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
20f00 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
20f10 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20f20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
20f30 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
20f40 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
20f50 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
20f60 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
20f70 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
20f80 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
20f90 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
20fa0 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
20fb0 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
20fc0 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
20fd0 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
20fe0 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
20ff0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
21000 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21020 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
21030 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
21040 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21050 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
21060 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
21070 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
21080 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
21090 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
210a0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
210b0 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
210c0 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
210d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
210e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
210f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
21100 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
21110 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
21120 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
21130 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21140 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
21150 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
21160 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
21170 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
21180 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
21190 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
211a0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
211b0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
211c0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
211d0 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
211e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
211f0 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
21200 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
21210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21220 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
21230 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
21240 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
21250 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
21260 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
21270 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21280 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
21290 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
212a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
212b0 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
212c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
212d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
212e0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
212f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21300 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21310 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21320 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21330 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
21340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
21350 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
21360 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
21370 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
21380 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
21390 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
213a0 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
213b0 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
213c0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
213d0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
213e0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
213f0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
21400 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
21410 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
21420 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
21430 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
21440 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
21450 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
21460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21470 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21480 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
21490 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e  i64)pSavepoint->
214a0 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
214b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
214c0 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
214d0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
214e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
214f0 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f  WalSavepointUndo
21500 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
21510 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44  Savepoint->aWalD
21520 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
21530 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e  for(ii=pSavepoin
21540 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d  t->iSubRec; rc==
21550 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21560 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
21570 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
21580 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69  sert( offset==(i
21590 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  64)ii*(4+pPager-
215a0 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
215b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
215c0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
215d0 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74  (pPager, &offset
215e0 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a  , pDone, 0, 1);.
215f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21610 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
21620 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
21630 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
21640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21650 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21660 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
21670 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
21680 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
21690 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
216a0 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
216b0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
216c0 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
216d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
216e0 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
216f0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
21700 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
21710 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
21720 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21730 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
21740 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54  .** Invoke SQLIT
21750 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
21760 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  E based on the c
21770 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
21780 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69  szMmap..*/.stati
21790 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d  c void pagerFixM
217a0 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  aplimit(Pager *p
217b0 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49  Pager){.#if SQLI
217c0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
217d0 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  >0.  sqlite3_fil
217e0 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e  e *fd = pPager->
217f0 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  fd;.  if( isOpen
21800 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74  (fd) && fd->pMet
21810 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
21820 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
21830 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73  _int64 sz;.    s
21840 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  z = pPager->szMm
21850 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ap;.    pPager->
21860 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e  bUseFetch = (sz>
21870 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
21880 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
21890 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
218a0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
218b0 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
218c0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
218d0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
218e0 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
218f0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
21900 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21910 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
21920 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
21930 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
21940 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
21950 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
21960 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
21970 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
21980 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
21990 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
219a0 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
219b0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
219c0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
219d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
219e0 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
219f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
21a00 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
21a10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
21a30 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
21a40 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
21a50 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
21a60 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
21a70 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
21a80 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
21a90 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
21aa0 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
21ab0 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
21ac0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
21ad0 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
21ae0 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
21af0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
21b00 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
21b10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
21b20 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
21b30 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
21b40 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68  .** There are th
21b50 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
21b60 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
21b70 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
21b80 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
21b90 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
21ba0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
21bb0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
21bc0 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
21bd0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
21be0 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
21bf0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
21c00 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
21c10 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
21c20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21c30 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
21c40 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
21c50 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
21c60 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
21c70 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
21c80 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
21c90 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
21ca0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
21cb0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
21cc0 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
21cd0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
21ce0 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
21cf0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
21d00 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
21d10 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
21d20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
21d30 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
21d40 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
21d50 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
21d60 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
21d70 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
21d80 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
21d90 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
21da0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
21db0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
21dc0 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
21dd0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
21de0 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
21df0 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
21e00 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
21e10 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
21e20 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
21e30 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
21e50 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
21e60 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
21e70 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
21e80 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
21e90 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
21ea0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
21eb0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
21ec0 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
21ed0 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
21ee0 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
21ef0 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
21f00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21f10 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
21f20 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
21f30 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
21f40 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
21f50 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72  The above is for
21f60 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72   a rollback-jour
21f70 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57  nal mode.  For W
21f80 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e  AL mode, OFF con
21f90 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61  tinues.** to mea
21fa0 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20  n that no syncs 
21fb0 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52  ever occur.  NOR
21fc0 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  MAL means that t
21fd0 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64  he WAL is synced
21fe0 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65  .** prior to the
21ff0 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70   start of checkp
22000 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68  oint and that th
22010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22020 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20  is synced.** at 
22030 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
22040 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
22050 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63   if the entire c
22060 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41  ontent of the WA
22070 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e  L.** was written
22080 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
22090 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f  atabase.  But no
220a0 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73   sync operations
220b0 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e   occur for.** an
220c0 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74   ordinary commit
220d0 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20   in NORMAL mode 
220e0 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20  with WAL.  FULL 
220f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
22100 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79  AL.** file is sy
22110 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  nced following e
22120 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61  ach commit opera
22130 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f  tion, in additio
22140 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63  n to the.** sync
22150 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22160 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20  h NORMAL..**.** 
22170 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73  Do not confuse s
22180 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
22190 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43  with SQLITE_SYNC
221a0 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53  _FULL.  The.** S
221b0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
221c0 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75  macro means to u
221d0 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74  se the MacOSX-st
221e0 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a  yle full-fsync.*
221f0 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f  * using fcntl(F_
22200 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c  FULLFSYNC).  SQL
22210 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
22220 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a  means to do an.*
22230 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63  * ordinary fsync
22240 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20  () call.  There 
22250 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
22260 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
22270 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64  SYNC_FULL.** and
22280 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22290 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  MAL on platforms
222a0 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f   other than MacO
222b0 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20  SX.  But the.** 
222c0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
222d0 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e   versus synchron
222e0 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69  ous=NORMAL setti
222f0 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ng determines wh
22300 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20  en.** the xSync 
22310 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c  primitive is cal
22320 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76  led and is relev
22330 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66  ant to all platf
22340 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  orms..**.** Nume
22350 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
22360 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
22370 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
22380 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
22390 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
223a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
223b0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
223c0 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
223d0 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50  gerSetFlags(.  P
223e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
223f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
22400 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20  r to set safety 
22410 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75  level for */.  u
22420 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
22430 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
22440 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e  flags */.){.  un
22450 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70  signed level = p
22460 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
22470 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b  YNCHRONOUS_MASK;
22480 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c  .  assert( level
22490 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20  >=1 && level<=3 
224a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
224b0 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
224c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
224d0 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
224e0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
224f0 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
22500 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
22510 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61   ?1:0;.  if( pPa
22520 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
22530 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22540 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50  lags = 0;.    pP
22550 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22560 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
22570 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
22580 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29  AGER_FULLFSYNC )
22590 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
225a0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
225b0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
225c0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
225d0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
225e0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
225f0 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
22600 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46  PAGER_CKPT_FULLF
22610 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22620 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22630 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22640 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
22650 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22660 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22680 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22690 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
226a0 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
226b0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
226c0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
226d0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61  ORMAL;.  }.  pPa
226e0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
226f0 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  s = pPager->sync
22700 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61  Flags;.  if( pPa
22710 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
22720 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
22730 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c  SyncFlags |= WAL
22740 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
22750 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NS;.  }.  if( pg
22760 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41  Flags & PAGER_CA
22770 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20  CHESPILL ){.    
22780 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
22790 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
227a0 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OFF;.  }else{. 
227b0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
227c0 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
227d0 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65  AG_OFF;.  }.}.#e
227e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
227f0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
22800 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
22810 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
22820 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
22830 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
22840 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
22850 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
22860 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
22870 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
22880 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
22890 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
228a0 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
228b0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
228c0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
228d0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
228e0 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
228f0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
22900 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
22910 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
22920 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22930 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
22940 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
22950 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
22960 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
22970 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
22980 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
22990 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
229a0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
229b0 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
229c0 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
229d0 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
229e0 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
229f0 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
22a00 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
22a10 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
22a20 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
22a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
22a40 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
22a50 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
22a60 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
22a70 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
22a80 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
22a90 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
22aa0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
22ab0 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
22ac0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
22ad0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
22ae0 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
22af0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
22b00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
22b10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
22b20 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
22b30 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
22b40 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
22b50 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
22b60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22b90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22ba0 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
22bb0 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
22bc0 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
22bd0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
22be0 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
22bf0 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
22c00 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
22c10 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
22c20 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
22c30 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
22c40 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
22c50 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
22c60 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
22c70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
22c80 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
22c90 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
22ca0 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
22cb0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22cc0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
22cd0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
22ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
22cf0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
22d00 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
22d10 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
22d20 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
22d30 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
22d40 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
22d50 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
22d60 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
22d70 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
22d80 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
22d90 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
22da0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
22db0 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
22dc0 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
22dd0 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
22de0 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
22df0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
22e00 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
22e10 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
22e20 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
22e30 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
22e40 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
22e50 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
22e60 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
22e70 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
22e80 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
22e90 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
22ea0 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
22ec0 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
22ed0 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
22ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f10 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
22f20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
22f30 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
22f40 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
22f50 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
22f60 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
22f70 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
22f80 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
22f90 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
22fa0 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
22fb0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
22fc0 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
22fd0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
22fe0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
22ff0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
23000 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
23010 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
23020 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
23030 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
23040 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
23050 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
23060 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
23070 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
23080 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
23090 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
230a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
230d0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
230e0 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
230f0 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
23100 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
23110 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
23120 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
23130 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23150 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
23160 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
23170 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
23180 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
23190 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
231a0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
231b0 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
231c0 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
231d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
231e0 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
231f0 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
23200 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
23210 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
23220 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
23230 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
23240 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
23250 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
23260 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
23270 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
23280 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
23290 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
232a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
232b0 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
232c0 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
232d0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
232e0 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
232f0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
23300 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
23310 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
23320 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
23330 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23340 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
23350 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
23360 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23370 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
23380 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
23390 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
233a0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
233b0 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
233c0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
233d0 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
233e0 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
233f0 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
23400 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
23410 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
23420 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23430 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
23440 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
23450 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
23460 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
23470 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
23480 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
23490 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
234a0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
234b0 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
234c0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
234d0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
234e0 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
234f0 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
23500 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
23510 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
23520 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
23530 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
23540 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
23550 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
23560 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
23570 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
23580 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
23590 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
235a0 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
235b0 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
235c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
235d0 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
235e0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
235f0 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
23600 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
23610 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
23620 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
23630 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
23640 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
23650 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
23660 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
23670 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
23680 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
23690 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
236a0 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
236b0 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
236c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
236d0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
236e0 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
236f0 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
23700 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
23710 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
23720 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
23730 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
23740 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
23750 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
23760 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
23770 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
23780 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
23790 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
237a0 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
237b0 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
237c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
237d0 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
237e0 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
237f0 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
23800 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
23810 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
23820 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
23830 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
23840 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
23850 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
23860 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
23870 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
23880 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
23890 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
238a0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
238b0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
238c0 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
238d0 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
238e0 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
238f0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
23900 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
23910 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
23920 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
23930 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
23940 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
23950 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
23960 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
23970 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
23980 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
23990 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
239a0 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
239b0 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
239c0 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
239d0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
239e0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
239f0 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
23a00 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
23a10 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
23a20 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
23a30 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
23a40 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
23a50 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
23a60 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
23a70 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
23a80 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
23a90 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
23aa0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
23ab0 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
23ac0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
23ad0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
23ae0 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
23af0 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
23b00 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
23b10 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
23b20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
23b30 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
23b40 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
23b50 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
23b60 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
23b70 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
23b80 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
23b90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23ba0 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
23bb0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
23bc0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
23bd0 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
23be0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
23c00 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
23c10 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
23c20 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
23c30 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
23c40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23c50 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
23c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23c70 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
23c80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
23c90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
23ca0 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
23cb0 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
23cc0 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
23cd0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
23ce0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  geSize;.      sq
23cf0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
23d00 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
23d10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23d20 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
23d30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
23d40 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
23d50 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
23d60 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
23d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
23d80 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
23d90 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
23da0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23db0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
23dc0 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
23dd0 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
23de0 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
23df0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
23e00 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
23e10 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
23e20 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
23e30 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
23e40 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
23e50 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
23e60 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
23e70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
23e80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23e90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23ea0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
23eb0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
23ec0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
23ed0 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
23ee0 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
23ef0 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
23f00 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
23f10 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
23f20 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
23f30 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
23f40 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
23f50 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
23f60 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
23f70 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
23f80 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
23f90 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
23fa0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
23fb0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
23fc0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
23fd0 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
23fe0 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
23ff0 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
24000 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
24010 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
24020 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
24030 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
24040 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
24050 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
24060 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
24070 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
24080 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
24090 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
240a0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
240b0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
240c0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
240d0 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
240e0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
240f0 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
24100 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
24110 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
24120 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
24130 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
24140 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
24150 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
24160 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
24170 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
24180 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
24190 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
241a0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
241b0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
241c0 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
241d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
241e0 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
241f0 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
24200 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
24210 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
24220 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d  pPager->mxPgno>=
24230 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
24240 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  ;  /* OP_MaxPgcn
24250 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20  t enforces this 
24260 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
24270 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
24280 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
24290 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
242a0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
242b0 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
242c0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
242d0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
242e0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
242f0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
24300 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
24310 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
24320 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
24330 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
24340 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
24350 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
24360 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
24370 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
24380 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
24390 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
243a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
243b0 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
243c0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
243d0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
243e0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
243f0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
24400 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
24410 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
24420 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24430 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
24440 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
24450 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
24460 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24470 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
24480 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
24490 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
244a0 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
244b0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
244c0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
244d0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
244e0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
244f0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
24500 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
24510 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24520 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
24530 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
24540 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
24550 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
24560 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
24570 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
24580 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
24590 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
245a0 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
245b0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
245c0 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
245d0 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
245e0 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
245f0 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
24600 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
24610 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
24620 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
24630 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
24640 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
24650 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
24660 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
24670 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
24680 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
24690 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
246a0 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
246b0 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
246c0 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
246d0 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
246e0 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
246f0 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
24700 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
24710 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
24720 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
24730 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
24740 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
24750 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
24760 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
24770 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
24780 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
24790 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
247a0 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
247b0 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
247c0 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
247d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
247e0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
247f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
24800 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
24810 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
24820 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
24830 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
24840 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
24850 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
24860 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
24870 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
24880 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
24890 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
248a0 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
248b0 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
248c0 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
248d0 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
248e0 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
248f0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
24900 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
24910 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
24920 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
24930 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
24940 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
24950 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
24960 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
24970 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
24980 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
24990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
249a0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
249b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
249c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
249d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
249e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
249f0 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
24a00 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
24a10 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
24a20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
24a30 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
24a40 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
24a50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
24a60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24a70 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
24a80 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
24a90 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
24aa0 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
24ab0 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
24ac0 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
24ad0 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
24ae0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24af0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
24b00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24b10 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
24b20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
24b30 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
24b40 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
24b50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
24b60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
24b70 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
24b80 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
24b90 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
24ba0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
24bb0 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
24bc0 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
24bd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
24be0 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
24bf0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
24c00 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
24c10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24c20 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
24c30 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
24c40 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
24c50 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
24c60 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
24c70 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
24c80 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
24c90 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
24ca0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
24cb0 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
24cc0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
24cd0 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
24ce0 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
24cf0 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
24d00 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
24d10 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
24d20 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
24d30 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
24d40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
24d50 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
24d60 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
24d70 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
24d80 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
24d90 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
24da0 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
24db0 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
24dc0 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
24dd0 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
24de0 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
24df0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
24e00 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
24e10 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
24e20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
24e30 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
24e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24e70 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
24e80 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
24e90 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
24ea0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
24eb0 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
24ec0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f  ready held, or o
24ed0 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
24ee0 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  stions that the 
24ef0 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
24f00 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
24f10 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
24f20 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
24f30 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
24f40 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
24f50 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
24f60 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
24f70 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
24f80 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
24f90 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
24fa0 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
24fb0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
24fc0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
24fd0 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
24fe0 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
24ff0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
25000 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
25010 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
25020 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
25030 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
25040 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
25050 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
25060 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
25070 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
25080 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
25090 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
250a0 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
250b0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
250c0 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
250d0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
250e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
250f0 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
25100 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
25110 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
25120 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
25130 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
25140 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
25150 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
25160 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
25170 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
25180 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
25190 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
251a0 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
251b0 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
251c0 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
251d0 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
251e0 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
251f0 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
25200 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
25210 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
25220 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
25230 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
25240 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
25250 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
25260 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
25270 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
25280 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
25290 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
252a0 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
252b0 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
252c0 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
252d0 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
252e0 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
252f0 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
25300 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
25310 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
25320 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
25330 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
25340 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
25350 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
25360 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
25370 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
25380 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
25390 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
253a0 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
253b0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
253c0 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
253d0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
253e0 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
253f0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
25400 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
25410 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
25420 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
25430 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
25440 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
25450 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
25460 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
25470 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
25480 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
25490 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
254a0 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
254b0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
254c0 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
254d0 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
254e0 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
254f0 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
25500 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
25510 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
25520 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25530 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25540 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
25550 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
25560 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
25570 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
25580 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
25590 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
255a0 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
255b0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
255c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
255d0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
255e0 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
255f0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
25600 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
25610 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
25620 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
25630 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
25640 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
25650 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25660 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25670 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
25680 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
25690 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
256a0 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
256b0 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
256c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
256d0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
256e0 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
256f0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
25700 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
25710 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
25720 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
25730 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
25740 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
25750 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
25760 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
25770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
25780 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
25790 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
257a0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
257b0 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
257c0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
257d0 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
257e0 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
257f0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
25800 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
25810 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
25820 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
25830 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
25840 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
25850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
25860 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
25870 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
25880 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
25890 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
258a0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
258b0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
258c0 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
258d0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
258e0 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
258f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
25900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
25910 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
25920 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25930 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
25940 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
25950 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
25960 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25970 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
25980 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
25990 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
259a0 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
259b0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
259c0 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
259d0 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
259e0 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
259f0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
25a00 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
25a10 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
25a20 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
25a30 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
25a40 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
25a50 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
25a60 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
25a70 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
25a80 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
25a90 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
25aa0 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
25ab0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
25ac0 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
25ad0 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
25ae0 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
25af0 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
25b00 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
25b10 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
25b20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
25b30 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
25b40 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
25b50 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25b60 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
25b70 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
25b80 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
25b90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25ba0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
25bb0 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
25bc0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
25bd0 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
25be0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
25bf0 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
25c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25c10 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
25c20 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
25c30 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
25c40 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
25c50 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
25c60 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
25c70 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
25c80 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
25c90 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
25ca0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
25cb0 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
25cc0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
25cd0 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
25ce0 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
25cf0 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
25d00 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
25d10 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
25d20 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
25d30 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
25d40 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
25d50 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
25d60 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
25d70 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
25d80 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
25d90 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
25da0 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
25db0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25dc0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
25dd0 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
25de0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
25df0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
25e00 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
25e10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25e20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25e30 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
25e40 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
25e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
25e60 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
25e70 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
25e80 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
25e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25ea0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25eb0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
25ec0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
25ed0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
25ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
25f00 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
25f10 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   memory mapped p
25f20 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70  age object for p
25f30 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
25f40 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a   .** The new obj
25f50 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ect will use the
25f60 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20   pointer pData, 
25f70 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46  obtained from xF
25f80 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75  etch()..** If su
25f90 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
25fa0 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74  pPage to point t
25fb0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72  o the new page r
25fc0 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20  eference.** and 
25fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25fe0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
25ff0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
26000 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74  ror code and set
26010 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a  .** *ppPage to z
26020 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ero..**.** Page 
26030 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69  references obtai
26040 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ned by calling t
26050 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
26060 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a  uld be released.
26070 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61  ** by calling pa
26080 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26090 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
260a0 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  nt pagerAcquireM
260b0 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20  apPage(.  Pager 
260c0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
260d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
260e0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
260f0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26110 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
26120 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  .  void *pData, 
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64     /* xFetch()'d
26150 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70   data for this p
26160 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
26170 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20  *ppPage         
26180 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26190 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f   Acquired page o
261a0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67  bject */.){.  Pg
261b0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261d0 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   Memory mapped p
261e0 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  age to return */
261f0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
26200 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b  pMmapFreelist ){
26210 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
26220 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26230 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50  Freelist;.    pP
26240 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26250 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ist = p->pDirty;
26260 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
26270 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   0;.    memset(p
26280 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
26290 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
262a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
262b0 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20  ge = p = (PgHdr 
262c0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
262d0 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72  ero(sizeof(PgHdr
262e0 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
262f0 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ra);.    if( p==
26300 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26310 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26320 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
26330 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
26340 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
26350 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26360 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
26370 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
26380 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
26390 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
263a0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
263b0 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
263c0 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
263d0 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
263e0 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
263f0 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
26400 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26410 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
26420 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
26430 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
26440 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
26450 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
26460 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
26470 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
26480 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
26490 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
264a0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
264b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
264c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
264d0 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
264e0 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
264f0 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
26500 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
26510 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
26520 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
26530 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
26540 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26550 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
26560 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
26570 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
26580 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
26590 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
265a0 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
265b0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
265c0 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
265d0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
265e0 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
265f0 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
26600 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
26610 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
26620 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26630 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
26640 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
26650 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
26660 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
26670 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
26680 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
26690 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
266a0 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
266b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
266c0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
266d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
266e0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
266f0 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
26700 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
26710 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
26720 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
26730 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
26740 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26750 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
26760 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
26770 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
26780 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
26790 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
267a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
267b0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
267c0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
267d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
267e0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
267f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
26800 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
26810 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
26820 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
26830 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
26840 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
26850 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
26860 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
26870 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
26880 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
26890 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
268a0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
268b0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
268c0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
268d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
268e0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
268f0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
26900 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
26910 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
26920 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
26930 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
26940 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
26950 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
26960 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
26970 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
26980 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
26990 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
269a0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
269b0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
269c0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
269d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
269e0 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
269f0 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
26a00 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
26a10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
26a20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
26a30 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
26a40 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
26a50 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
26a60 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
26a70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
26a80 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
26a90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
26aa0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
26ab0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
26ac0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
26ad0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
26ae0 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
26af0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
26b00 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
26b10 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26b20 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
26b30 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
26b40 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
26b50 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
26b60 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
26b70 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
26b80 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
26b90 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
26ba0 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
26bb0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
26bc0 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
26bd0 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
26be0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
26bf0 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
26c00 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
26c10 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
26c20 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
26c30 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
26c40 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
26c50 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
26c60 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
26c70 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
26c80 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
26c90 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
26ca0 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
26cb0 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
26cc0 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
26cd0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
26ce0 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
26cf0 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
26d00 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
26d10 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
26d20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
26d30 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
26d40 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
26d50 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
26d60 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
26d70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
26d80 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
26d90 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
26da0 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
26db0 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
26dc0 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
26dd0 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
26de0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
26df0 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
26e00 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
26e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
26e20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
26e30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26e40 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
26e50 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
26e60 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
26e70 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
26e80 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
26e90 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
26ea0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
26eb0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
26ec0 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
26ed0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
26ee0 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
26ef0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
26f00 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26f10 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
26f20 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
26f30 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
26f40 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
26f50 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
26f60 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
26f70 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
26f80 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
26f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
26fa0 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
26fb0 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
26fc0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
26fd0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
26fe0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
26ff0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
27000 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
27010 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
27020 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
27030 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
27040 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
27050 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
27060 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
27070 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
27080 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
27090 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
270a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
270b0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
270c0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
270d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
270e0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
270f0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
27100 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
27110 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
27120 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
27130 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
27140 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
27150 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27160 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
27170 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
27180 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
27190 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
271a0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
271b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
271c0 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
271d0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
271e0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
271f0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
27200 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
27210 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
27220 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
27230 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
27240 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
27250 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
27260 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
27270 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
27280 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
27290 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
272a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
272b0 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
272c0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
272d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
272e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
272f0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
27300 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
27310 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
27320 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
27330 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
27340 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
27350 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
27360 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
27370 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
27380 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
27390 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
273a0 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
273b0 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
273c0 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
273d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
273e0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
273f0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27400 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
27410 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
27420 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
27430 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
27440 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
27450 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
27460 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
27470 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
27480 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
27490 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
274a0 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
274b0 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
274c0 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
274d0 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
274e0 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
274f0 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
27500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27510 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
27520 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
27530 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
27540 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
27550 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27560 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
27570 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
27580 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
27590 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
275a0 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
275b0 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
275c0 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
275d0 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
275e0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
275f0 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27600 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27610 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
27620 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27630 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
27640 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
27650 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
27660 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
27670 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
27680 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
27690 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
276a0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
276b0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
276c0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
276d0 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
276e0 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
276f0 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
27700 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27710 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
27720 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
27730 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
27740 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
27750 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27760 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
27770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
27780 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
27790 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
277a0 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
277d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
277e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
277f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27800 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
27810 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
27820 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27830 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
27840 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
27850 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
27860 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27870 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27880 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
27890 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
278a0 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
278b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
278c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
278d0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
278e0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
278f0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27900 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
27910 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27920 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
27930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27940 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27950 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
27960 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
27970 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
27980 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
27990 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
279a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
279b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
279c0 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
279d0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
279e0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
279f0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
27a00 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
27a10 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
27a20 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
27a30 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
27a40 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
27a50 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
27a60 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
27a70 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
27a80 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
27a90 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
27aa0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27ab0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
27ac0 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
27ad0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
27ae0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
27af0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
27b00 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
27b10 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
27b20 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
27b30 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
27b40 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
27b50 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
27b60 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
27b70 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
27b80 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
27b90 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
27ba0 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
27bb0 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
27bc0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
27bd0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
27be0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
27bf0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
27c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
27c10 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
27c20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
27c30 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
27c40 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
27c50 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
27c60 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
27c70 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
27c80 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
27c90 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
27ca0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27cb0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
27cc0 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
27cd0 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
27ce0 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
27cf0 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
27d00 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
27d10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
27d20 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
27d30 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
27d40 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
27d50 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
27d60 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
27d70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
27d80 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
27d90 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
27da0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
27db0 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
27dc0 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
27dd0 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
27de0 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
27df0 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
27e00 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
27e10 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
27e20 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
27e30 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
27e40 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
27e50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27e60 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
27e70 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
27e80 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
27e90 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
27ea0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
27eb0 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
27ec0 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
27ed0 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
27ee0 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
27ef0 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
27f00 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
27f10 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
27f20 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
27f30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
27f40 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
27f50 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
27f60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
27f70 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
27f80 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
27f90 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
27fa0 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
27fb0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
27fc0 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
27fd0 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
27fe0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
27ff0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28000 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
28010 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
28020 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
28030 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
28040 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
28050 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
28060 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
28070 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28090 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
280a0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
280b0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
280c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
280d0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
280e0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
280f0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
28100 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
28110 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
28120 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
28130 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28140 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28150 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
28160 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
28170 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
28180 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28190 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
281a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
281b0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
281c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
281d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
281e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
281f0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
28200 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28210 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
28220 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
28230 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
28240 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28250 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
28260 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
28270 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
28280 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
28290 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
282a0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
282b0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
282c0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
282d0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
282e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
282f0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
28300 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
28310 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
28320 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
28330 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
28340 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
28350 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
28360 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
28370 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
28380 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
28390 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
283a0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
283b0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
283c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
283d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
283e0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
283f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
28400 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
28410 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
28420 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
28430 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
28440 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28450 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
28460 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28470 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28480 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
28490 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
284a0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
284b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
284c0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
284d0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
284e0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
284f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28500 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28510 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28520 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
28530 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28540 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28550 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
28560 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28570 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
28580 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
28590 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
285a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
285b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
285c0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
285d0 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
285e0 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
285f0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28600 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28610 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28620 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28630 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28640 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
28650 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
28660 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
28670 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28680 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28690 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
286a0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
286b0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
286c0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
286d0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
286e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
286f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28700 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
28710 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
28720 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
28730 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
28740 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
28750 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
28760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28790 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
287a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
287b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
287c0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
287d0 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
287e0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
287f0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
28800 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
28810 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
28820 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
28830 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28850 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28870 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
28880 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
288a0 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
288b0 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
288c0 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
288d0 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
288e0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
288f0 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
28900 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
28910 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
28920 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
28930 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
28940 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
28950 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
28960 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
28970 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
28980 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
28990 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
289a0 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
289b0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
289c0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
289d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
289e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
289f0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
28a00 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
28a10 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
28a20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
28a30 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
28a40 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
28a50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
28a60 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
28a70 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
28a80 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
28a90 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
28aa0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
28ab0 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
28ac0 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
28ad0 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
28ae0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
28af0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28b00 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
28b10 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
28b20 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
28b30 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
28b40 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
28b50 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
28b60 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
28b70 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
28b80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
28b90 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
28ba0 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
28bb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
28bc0 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
28bd0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
28be0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
28bf0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
28c00 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
28c10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28c20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
28c30 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
28c40 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
28c50 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
28c60 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
28c70 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
28c80 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
28c90 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
28ca0 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
28cb0 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
28cc0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
28cd0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
28ce0 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
28cf0 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
28d00 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
28d10 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
28d20 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
28d30 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
28d40 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
28d50 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
28d60 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
28d70 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
28d80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
28d90 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
28da0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
28db0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
28dc0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
28dd0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
28de0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
28df0 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
28e00 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
28e10 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
28e20 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
28e30 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
28e40 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
28e50 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
28e60 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
28e70 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
28e80 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
28e90 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
28ea0 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
28eb0 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
28ec0 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
28ed0 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
28ee0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
28ef0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
28f00 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
28f10 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
28f20 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28f30 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
28f40 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
28f50 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
28f60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
28f70 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
28f80 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
28f90 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
28fa0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
28fb0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
28fc0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
28fd0 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
28fe0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
28ff0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
29000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29030 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
29040 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
29050 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
29060 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
29070 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
29080 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
29090 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
290a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
290b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
290c0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
290d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
290e0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
290f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
29100 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
29110 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
29120 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
29130 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
29140 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
29150 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
29160 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
29170 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
29180 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
29190 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
291a0 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
291b0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
291c0 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
291d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
291e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
291f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29200 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29210 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
29220 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
29230 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
29240 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
29250 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
29260 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
29270 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
29280 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
29290 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
292a0 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
292b0 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
292c0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
292d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
292e0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
292f0 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
29300 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
29310 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69   && pPager->dbHi
29320 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  ntSize<pPager->d
29330 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69  bSize.   && (pLi
29340 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c  st->pDirty || pL
29350 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  ist->pgno>pPager
29360 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20  ->dbHintSize).  
29370 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
29380 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
29390 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
293a0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
293b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
293c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
293d0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
293e0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
293f0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
29400 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
29410 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29420 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
29430 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
29440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29450 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
29460 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
29470 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
29480 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
29490 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
294a0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
294b0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
294c0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
294d0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
294e0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
294f0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
29500 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
29510 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
29520 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
29530 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
29540 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
29550 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
29560 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
29570 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
29580 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
29590 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
295a0 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
295b0 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
295c0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
295d0 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
295e0 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
295f0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
29600 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29610 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
29620 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
29630 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
29640 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
29650 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
29660 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
29670 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29680 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
29690 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
296a0 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
296b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
296d0 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
296e0 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
296f0 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
29700 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29710 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
29720 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
29730 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
29740 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
29750 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
29760 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
29770 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
29780 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
29790 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
297a0 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
297b0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
297c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
297d0 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
297e0 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
297f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29800 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
29810 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
29820 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
29830 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
29840 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
29850 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
29860 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
29870 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
29880 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
29890 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
298a0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
298b0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
298c0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
298d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
298e0 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
298f0 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
29900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29910 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
29920 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
29930 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
29940 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
29950 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
29960 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
29970 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
29980 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
29990 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
299a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
299b0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
299c0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
299d0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
299e0 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
299f0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
29a00 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
29a10 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
29a20 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
29a30 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
29a40 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
29a50 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
29a60 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
29a70 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
29a80 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29a90 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
29aa0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29ad0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
29ae0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
29af0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
29b00 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
29b10 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
29b20 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
29b30 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
29b40 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
29b50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29b60 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29b70 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
29b80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29b90 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
29ba0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
29bb0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
29bc0 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
29bd0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
29be0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
29bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
29c00 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
29c10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
29c20 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
29c30 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
29c40 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
29c50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
29c60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29c70 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
29c80 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
29c90 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
29ca0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
29cb0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
29cc0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
29cd0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
29ce0 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
29cf0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
29d00 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
29d10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29d20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29d30 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
29d40 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
29d50 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
29d60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29d70 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
29d80 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
29d90 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
29da0 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
29db0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
29dc0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
29dd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29de0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
29df0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
29e00 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
29e10 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
29e20 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
29e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29e40 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
29e50 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
29e60 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
29e70 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
29e80 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
29e90 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
29ea0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
29eb0 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
29ec0 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
29ed0 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
29ee0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
29ef0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
29f00 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
29f10 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
29f20 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
29f30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
29f40 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
29f50 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
29f60 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
29f70 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
29f80 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
29f90 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
29fa0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
29fb0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
29fc0 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
29fd0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
29fe0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
29ff0 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2a000 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2a010 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2a020 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2a030 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2a040 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2a050 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2a060 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2a070 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2a080 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2a090 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a0a0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2a0b0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2a0c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2a0d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2a0e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a0f0 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2a100 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2a110 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2a120 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2a130 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2a140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2a150 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2a160 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2a170 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2a180 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a190 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2a1a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a1b0 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2a1c0 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2a1d0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2a1e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2a1f0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2a200 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2a210 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2a220 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2a230 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2a240 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2a250 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2a260 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2a270 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2a280 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2a290 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2a2a0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2a2b0 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2a2c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2a2d0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2a2e0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2a2f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a300 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2a310 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2a320 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2a330 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2a340 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2a350 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2a360 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2a370 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
2a380 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2a390 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2a3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a3b0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
2a3c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a3d0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
2a3e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2a3f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2a400 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a410 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2a420 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
2a430 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
2a440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a460 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a470 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a480 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
2a490 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a4a0 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
2a4b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a4c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a4d0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
2a4e0 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
2a4f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a500 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
2a510 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
2a520 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2a530 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2a540 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2a550 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2a560 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2a570 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2a580 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2a590 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2a5a0 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2a5b0 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2a5c0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2a5d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2a5e0 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2a5f0 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2a600 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2a610 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2a620 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2a630 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2a640 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2a650 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2a660 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2a670 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2a680 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2a690 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2a6a0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2a6b0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2a6c0 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2a6d0 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2a6e0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2a6f0 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2a700 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2a710 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2a720 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2a730 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2a740 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2a750 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2a760 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2a770 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2a780 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2a790 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2a7a0 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2a7b0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2a7c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2a7d0 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2a7e0 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2a7f0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2a800 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2a810 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2a820 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2a830 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2a840 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2a850 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2a860 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2a870 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2a880 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2a890 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2a8a0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2a8b0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2a8c0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2a8d0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2a8e0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2a8f0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2a900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2a910 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2a920 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2a930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a940 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2a950 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a960 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2a970 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2a980 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2a990 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2a9a0 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2a9b0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2a9c0 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2a9d0 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2a9e0 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2a9f0 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2aa00 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2aa10 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2aa20 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2aa30 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2aa40 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2aa50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2aa60 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2aa70 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2aa80 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2aa90 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2aaa0 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2aab0 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2aac0 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2aad0 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2aae0 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2aaf0 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2ab00 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2ab10 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2ab20 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2ab30 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2ab40 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2ab50 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2ab60 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2ab70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2ab80 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2ab90 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2aba0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2abb0 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2abc0 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2abd0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2abe0 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2abf0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20  t implementaton 
2ac00 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2ac10 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2ac20 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2ac30 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2ac40 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2ac50 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2ac60 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2ac70 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2ac80 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2ac90 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2aca0 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2acb0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2acc0 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2acd0 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2ace0 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2acf0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2ad00 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2ad10 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2ad20 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2ad30 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2ad40 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2ad50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2ad60 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2ad70 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2ad80 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2ad90 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2ada0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2adb0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2adc0 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2add0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2ade0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2adf0 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2ae00 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2ae10 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2ae20 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2ae30 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2ae40 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2ae50 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2ae60 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2ae70 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2ae80 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2ae90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2aea0 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2aeb0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2aec0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2aed0 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
2aee0 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
2aef0 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
2af00 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
2af10 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2af20 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
2af30 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2af40 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
2af50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2af60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2af70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
2af80 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
2af90 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
2afa0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
2afb0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
2afc0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
2afd0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
2afe0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
2aff0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
2b000 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
2b010 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2b020 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
2b030 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b040 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2b050 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
2b060 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
2b070 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
2b080 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
2b090 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2b0a0 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
2b0b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
2b0c0 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
2b0d0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
2b0e0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2b0f0 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
2b100 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
2b110 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
2b120 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
2b130 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
2b140 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
2b150 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
2b160 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
2b170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
2b180 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
2b190 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
2b1a0 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
2b1b0 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
2b1c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
2b1d0 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
2b1e0 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
2b1f0 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
2b200 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
2b210 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
2b220 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
2b230 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
2b240 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
2b250 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
2b260 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
2b270 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
2b280 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
2b290 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
2b2a0 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
2b2b0 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
2b2c0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
2b2d0 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
2b2e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2b2f0 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
2b300 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
2b310 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
2b320 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
2b330 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
2b340 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
2b350 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
2b360 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
2b370 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2b380 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
2b390 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
2b3a0 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
2b3b0 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
2b3c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
2b3d0 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
2b3e0 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
2b3f0 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
2b400 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
2b410 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b420 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
2b430 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
2b440 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
2b450 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
2b460 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
2b470 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
2b480 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
2b490 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
2b4a0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
2b4b0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
2b4c0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
2b4d0 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
2b4e0 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
2b4f0 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
2b500 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
2b510 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
2b520 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
2b530 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
2b540 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
2b550 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
2b560 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
2b570 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2b580 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
2b590 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2b5a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b5b0 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
2b5c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2b5d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b5e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b5f0 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
2b600 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b610 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2b620 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2b630 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
2b640 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
2b650 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
2b660 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
2b670 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2b680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b690 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
2b6a0 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
2b6b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2b6c0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2b6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2b6e0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
2b6f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2b700 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
2b710 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a  er, rc); .}.../*
2b720 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2b730 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2b740 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2b750 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2b760 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2b770 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2b780 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2b790 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2b7a0 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2b7b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2b7c0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2b7d0 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2b7e0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2b7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b800 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2b810 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2b820 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2b830 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2b840 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2b850 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2b860 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2b870 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2b880 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2b890 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2b8a0 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2b8b0 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2b8c0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2b8d0 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2b8e0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2b8f0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2b900 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2b910 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2b920 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2b930 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2b940 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2b950 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2b960 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2b970 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2b980 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2b990 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2b9a0 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2b9b0 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2b9c0 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2b9d0 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2b9e0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2b9f0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2ba00 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2ba10 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
2ba20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2ba30 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2ba40 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2ba50 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2ba60 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2ba70 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2ba80 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2ba90 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2baa0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2bab0 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2bac0 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2bad0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2bae0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2baf0 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2bb00 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2bb10 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2bb20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2bb30 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2bb40 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2bb50 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2bb60 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2bb70 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2bb80 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2bb90 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2bba0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2bbb0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2bbc0 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2bbd0 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2bbe0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2bbf0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2bc00 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2bc10 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2bc20 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2bc30 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2bc40 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2bc50 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2bc60 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2bc70 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2bc80 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2bc90 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2bca0 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2bcb0 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2bcc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2bcd0 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2bce0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2bcf0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2bd00 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2bd10 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2bd20 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2bd30 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2bd40 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2bd50 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2bd60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2bd70 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2bd80 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2bd90 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2bda0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bdc0 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2bdd0 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2bde0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2bdf0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2be00 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2be10 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2be20 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2be30 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2be40 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2be50 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2be60 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2be70 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2be80 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2be90 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2bea0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2beb0 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2bec0 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2bed0 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2bee0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2bef0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2bf00 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2bf10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bf20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2bf30 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2bf40 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2bf50 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2bf60 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2bf70 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2bf80 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2bf90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2bfa0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2bfb0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2bfc0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2bfd0 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2bfe0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2bff0 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2c000 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2c010 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2c020 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2c030 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2c040 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2c050 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2c060 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2c070 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2c080 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2c090 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2c0a0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2c0b0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2c0c0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2c0d0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2c0e0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2c0f0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2c100 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2c110 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2c120 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2c130 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2c140 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2c150 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c160 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2c170 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2c180 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2c190 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2c1a0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2c1b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c1c0 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2c1d0 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2c1e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2c1f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2c200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c210 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2c220 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2c230 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2c240 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2c250 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2c260 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2c270 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2c280 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2c290 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2c2a0 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2c2b0 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
2c2c0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2c2d0 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
2c2e0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2c2f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2c300 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
2c310 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2c320 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
2c330 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
2c340 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
2c350 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
2c360 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
2c370 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
2c380 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
2c390 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
2c3a0 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
2c3b0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2c3c0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2c3d0 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
2c3e0 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
2c3f0 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
2c400 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2c410 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c420 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
2c430 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
2c440 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c450 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c460 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c470 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
2c480 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c490 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c4a0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2c4b0 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
2c4c0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2c4d0 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2c4e0 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2c4f0 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2c500 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2c510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c520 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2c530 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2c540 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2c550 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46   = 1;.    if( zF
2c560 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c570 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  name[0] ){.     
2c580 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2c590 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2c5a0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c5b0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2c5c0 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0  ) return SQL
2c5d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2c5e0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2c5f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2c600 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2c610 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2c620 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2c630 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2c640 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2c650 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2c660 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2c670 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2c680 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2c690 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2c6a0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2c6b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2c6c0 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2c6d0 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2c6e0 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2c6f0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2c700 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c710 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2c720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2c730 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2c740 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2c750 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2c760 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2c770 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2c780 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2c790 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2c7a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c7b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2c7c0 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2c7d0 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2c7e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2c7f0 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2c800 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2c810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c820 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2c830 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2c840 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2c850 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2c860 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c870 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2c880 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2c890 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2c8a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2c8b0 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2c8c0 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2c8d0 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2c8e0 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2c8f0 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2c900 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2c910 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2c920 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2c930 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2c940 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2c950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c960 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2c970 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2c980 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2c990 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2c9a0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2c9b0 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2c9c0 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2c9d0 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2c9e0 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2c9f0 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2ca00 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2ca10 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2ca20 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2ca30 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2ca40 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2ca50 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2ca60 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2ca70 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2ca80 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2ca90 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2caa0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2cab0 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2cac0 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2cad0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2cae0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2caf0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2cb00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cb10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2cb20 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2cb30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2cb40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2cb50 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2cb60 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2cb70 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2cb80 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2cb90 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2cba0 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2cbb0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2cbc0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2cbd0 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2cbe0 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2cbf0 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2cc00 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2cc10 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc30 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2cc40 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2cc50 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc70 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2cc80 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2cc90 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2cca0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2ccb0 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2ccc0 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2ccd0 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2cce0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2ccf0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2cd00 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2cd10 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2cd20 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2cd30 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2cd40 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2cd50 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2cd60 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2cd70 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2cd80 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2cd90 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2cda0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2cdb0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2cdc0 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2cdd0 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2cde0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2cdf0 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2ce00 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2ce10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2ce20 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2ce30 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2ce40 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2ce50 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2ce60 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2ce70 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2ce80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2ce90 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2cea0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2ceb0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2cec0 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2ced0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2cee0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2cef0 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2cf00 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2cf10 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2cf20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2cf30 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2cf40 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2cf50 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2cf60 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2cf70 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2cf80 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2cf90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2cfa0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2cfb0 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2cfc0 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2cfd0 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2cfe0 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2cff0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2d000 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2d010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d020 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
2d030 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2d040 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2d050 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2d060 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2d070 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2d080 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2d090 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2d0a0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2d0b0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d0c0 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2d0d0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2d0e0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d0f0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d100 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2d110 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2d120 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2d130 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2d140 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2d150 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d160 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2d170 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2d180 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2d190 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d1a0 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2d1b0 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2d1c0 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2d1d0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2d1e0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2d1f0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2d200 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2d210 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2d220 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2d230 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2d240 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2d250 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2d260 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2d270 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2d280 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d290 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d2a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2d2b0 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2d2c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d2d0 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2d2e0 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2d2f0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d300 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2d310 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d320 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2d330 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d340 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2d350 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2d360 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d370 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d380 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d390 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2d3a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d3b0 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2d3c0 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2d3d0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d3e0 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2d3f0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2d400 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d410 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2d420 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2d430 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d440 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2d450 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d460 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d470 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d480 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2d490 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d4a0 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d4b0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2d4c0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2d4d0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2d4e0 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2d4f0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2d500 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2d510 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d520 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d530 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d550 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2d560 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2d570 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2d580 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2d590 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2d5a0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2d5b0 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2d5c0 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2d5d0 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2d5e0 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2d5f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2d600 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2d610 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2d620 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2d630 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2d640 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2d650 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2d660 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2d670 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2d680 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2d690 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d6a0 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2d6b0 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2d6c0 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2d6d0 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2d6e0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2d6f0 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2d700 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2d710 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2d720 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2d730 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2d740 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2d750 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2d760 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2d770 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2d780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d790 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2d7a0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2d7b0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2d7c0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2d7d0 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20    if( !readOnly 
2d7e0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65  ){.        setSe
2d7f0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2d800 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d810 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2d820 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2d830 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d840 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2d850 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2d860 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2d870 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2d880 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2d890 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2d8a0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2d8b0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2d8c0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2d8d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2d8e0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2d8f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2d900 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2d910 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2d920 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2d930 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d940 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2d950 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2d960 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2d970 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
2d980 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
2d990 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2d9a0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2d9b0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2d9c0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2d9d0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2d9e0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2d9f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2da00 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2da10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2da20 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
2da30 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2da40 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2da50 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2da60 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2da70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2da80 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2da90 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2daa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2dab0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2dac0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ii;.            
2dad0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2dae0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2daf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2db00 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71  ger->noLock = sq
2db10 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2db20 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f  n(zFilename, "no
2db30 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20  lock", 0);.     
2db40 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49   if( (iDc & SQLI
2db50 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42  TE_IOCAP_IMMUTAB
2db60 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  LE)!=0.       ||
2db70 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2db80 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2db90 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20  "immutable", 0) 
2dba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73  ){.          vfs
2dbb0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2dbc0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2dbd0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63           goto ac
2dbe0 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2dbf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2dc00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2dc10 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2dc20 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2dc30 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2dc40 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2dc50 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2dc60 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2dc70 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2dc80 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2dc90 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2dca0 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2dcb0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2dcc0 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2dcd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2dce0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2dcf0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2dd00 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2dd10 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2dd20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2dd30 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2dd40 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2dd50 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2dd60 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2dd70 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2dd80 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2dd90 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2dda0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2ddb0 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20  ranch also runs 
2ddc0 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64  for files marked
2ddd0 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20   as immutable.. 
2dde0 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f     */ .act_like_
2ddf0 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74  temp_file:.    t
2de00 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2de10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2de20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20  = PAGER_READER; 
2de30 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2de40 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
2de50 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61   lock */.    pPa
2de60 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2de70 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20  LUSIVE_LOCK;    
2de80 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72  /* Pretend we ar
2de90 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e in EXCLUSIVE l
2dea0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a 20  ocking mode */. 
2deb0 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
2dec0 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  k = 1;          
2ded0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c        /* Do no l
2dee0 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65  ocking */.    re
2def0 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
2df00 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
2df10 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
2df20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2df30 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
2df40 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
2df50 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
2df60 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
2df70 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
2df80 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
2df90 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
2dfa0 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
2dfb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dfc0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2dfd0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
2dfe0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
2dff0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
2e000 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
2e010 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
2e020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
2e030 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2e040 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2e050 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2e060 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20  bject. */.  if( 
2e070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e080 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78  .    assert( nEx
2e090 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  tra<1000 );.    
2e0a0 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2e0b0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20  nExtra);.    rc 
2e0c0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f  = sqlite3PcacheO
2e0d0 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
2e0e0 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
2e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e100 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2e110 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2e120 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2e130 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2e140 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e150 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e160 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2e170 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2e180 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2e190 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2e1a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e1b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2e1c0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2e1d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2e1e0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2e1f0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2e200 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2e210 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2e220 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2e230 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2e240 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2e250 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2e260 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e270 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2e280 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2e290 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2e2a0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2e2b0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e2c0 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2e2d0 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2e2e0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2e2f0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e300 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2e310 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e320 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2e330 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2e340 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e350 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2e360 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e370 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2e380 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2e390 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2e3a0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2e3b0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2e3c0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2e3d0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e3e0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2e3f0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2e400 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2e410 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2e420 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e430 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2e440 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2e450 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2e460 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e470 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2e480 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2e490 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
2e4a0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
2e4b0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
2e4c0 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
2e4d0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2e4e0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
2e4f0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2e500 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
2e510 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
2e520 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
2e530 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
2e540 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
2e550 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
2e560 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
2e570 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
2e580 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
2e590 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2e5a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e5b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2e5c0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e5d0 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  t( pPager->syncF
2e5e0 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2e5f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77  ssert( pPager->w
2e600 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  alSyncFlags==0 )
2e610 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e620 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2e630 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ags==0 );.  }els
2e640 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  e{.    pPager->f
2e650 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  ullSync = 1;.   
2e660 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e670 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2e680 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
2e690 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2e6a0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2e6b0 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e  NORMAL | WAL_SYN
2e6c0 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
2e6d0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
2e6e0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2e6f0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2e700 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2e710 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
2e720 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2e730 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
2e740 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2e750 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
2e760 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
2e770 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
2e780 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
2e790 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
2e7a0 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
2e7b0 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
2e7c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2e7d0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
2e7e0 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
2e7f0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2e800 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
2e810 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
2e820 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2e830 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2e840 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
2e850 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
2e860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2e870 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2e880 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
2e890 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2e8a0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
2e8b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e8c0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
2e8d0 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
2e8e0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
2e8f0 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20  = xReinit;.  /* 
2e900 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
2e910 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2e920 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
2e930 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e940 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45  >szMmap = SQLITE
2e950 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
2e960 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65  ZE // will be se
2e970 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a  t by btree.c */.
2e980 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2e990 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2e9a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
2e9b0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
2e9c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2e9d0 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65  as not be delete
2e9e0 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74  d or renamed out
2e9f0 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74   from.** under t
2ea00 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  he pager.  Retur
2ea10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2ea20 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
2ea30 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67  till were it oug
2ea40 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64  ht.** to be on d
2ea50 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  isk.  Return non
2ea60 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45  -zero (SQLITE_RE
2ea70 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f  ADONLY_DBMOVED o
2ea80 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
2ea90 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20  or.** code from 
2eaa0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2eab0 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  )) if the databa
2eac0 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73  se has gone miss
2ead0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2eae0 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d  nt databaseIsUnm
2eaf0 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  oved(Pager *pPag
2eb00 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d  er){.  int bHasM
2eb10 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oved = 0;.  int 
2eb20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
2eb30 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65  r->tempFile ) re
2eb40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2eb50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2eb60 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Size==0 ) return
2eb70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2eb80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46  sert( pPager->zF
2eb90 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65  ilename && pPage
2eba0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  r->zFilename[0] 
2ebb0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2ebc0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
2ebd0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
2ebe0 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
2ebf0 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a  D, &bHasMoved);.
2ec00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ec10 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
2ec20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d   /* If the HAS_M
2ec30 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  OVED file-contro
2ec40 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74  l is unimplement
2ec50 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
2ec60 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
2ec70 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76  has not been mov
2ec80 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65  ed.  That is the
2ec90 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61   historical beha
2eca0 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20  vior of SQLite: 
2ecb0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
2ecc0 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69  version 3.8.3, i
2ecd0 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20  t never checked 
2ece0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
2ecf0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
2ed00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ed10 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b   && bHasMoved ){
2ed20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2ed30 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2ed40 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
2ed50 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
2ed60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2ed70 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2ed80 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2ed90 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2eda0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2edb0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2edc0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2edd0 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2ede0 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2edf0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2ee00 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2ee10 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2ee20 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2ee30 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2ee40 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2ee50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2ee60 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2ee70 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2ee80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2ee90 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2eea0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2eeb0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2eec0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2eed0 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2eee0 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2eef0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2ef00 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2ef10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ef20 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2ef30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ef40 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2ef50 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2ef60 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2ef70 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2ef80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ef90 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2efa0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2efb0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2efc0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2efd0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2efe0 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2eff0 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2f000 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2f010 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2f020 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2f030 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2f040 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2f050 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2f060 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2f070 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2f080 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2f090 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2f0a0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2f0b0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2f0c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2f0d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2f0e0 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2f0f0 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2f100 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2f110 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2f120 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2f130 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2f140 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2f150 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2f160 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2f170 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f180 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f190 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2f1a0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2f1b0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2f1c0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2f1d0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2f1e0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2f1f0 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2f200 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f210 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f220 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2f230 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2f240 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2f250 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f260 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2f270 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2f280 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2f290 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2f2a0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2f2b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2f2c0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2f2d0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2f2e0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2f2f0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2f300 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2f310 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2f320 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2f330 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2f340 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f350 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2f360 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2f370 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2f380 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2f390 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2f3a0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2f3b0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2f3c0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2f3d0 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2f3e0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2f3f0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2f400 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2f410 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f420 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2f430 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2f440 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2f450 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2f460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f470 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2f480 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2f490 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2f4a0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2f4b0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2f4c0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2f4d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2f4e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2f4f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2f500 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2f510 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2f520 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2f530 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2f540 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2f550 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2f560 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2f570 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2f580 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2f590 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2f5a0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2f5b0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f5c0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f5d0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2f5e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2f5f0 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2f600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f610 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2f620 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2f630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f640 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2f650 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2f660 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2f670 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2f680 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2f690 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2f6a0 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2f6b0 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2f6c0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2f6d0 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2f6e0 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2f6f0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f700 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2f710 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2f720 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2f730 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2f740 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2f750 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2f760 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2f770 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2f780 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2f790 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2f7a0 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2f7b0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2f7c0 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2f7d0 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2f7e0 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2f7f0 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2f800 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2f810 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2f820 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2f830 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2f840 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2f850 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2f860 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2f870 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2f880 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2f890 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2f8a0 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2f8b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f8c0 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2f8d0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f8f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2f900 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2f910 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  le */..      rc 
2f920 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2f930 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2f940 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2f950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f960 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2f970 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20  atabase is zero 
2f980 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  pages in size, t
2f990 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65  hat means that e
2f9a0 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20  ither (1) the.  
2f9b0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2f9c0 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72   is a remnant fr
2f9d0 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62  om a prior datab
2f9e0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2f9f0 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20  e name where.   
2fa00 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2fa10 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f  base file but no
2fa20 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  t the journal wa
2fa30 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32  s deleted, or (2
2fa40 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20  ) the initial.  
2fa50 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
2fa60 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61  tion that popula
2fa70 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61  tes a new databa
2fa80 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  se is being roll
2fa90 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ed back..       
2faa0 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61   ** In either ca
2fab0 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  se, the journal 
2fac0 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65  file can be dele
2fad0 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ted.  However, t
2fae0 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20  ake care.       
2faf0 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74   ** not to delet
2fb00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2fb10 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  le if it is alre
2fb20 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a  ady open due to.
2fb30 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
2fb40 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
2fb50 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fb60 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2fb70 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b   && !jrnlOpen ){
2fb80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fb90 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2fba0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2fbb0 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2fbc0 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2fbd0 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2fbe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fbf0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2fc00 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2fc10 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2fc20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2fc30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2fc40 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
2fc50 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2fc60 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2fc70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fc80 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
2fc90 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2fca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fcb0 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
2fcc0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2fcd0 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
2fce0 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
2fcf0 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
2fd00 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
2fd10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2fd20 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
2fd30 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
2fd40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
2fd50 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
2fd60 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
2fd70 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2fd80 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
2fd90 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
2fda0 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
2fdb0 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
2fdc0 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
2fdd0 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
2fde0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
2fdf0 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
2fe00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
2fe10 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2fe20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2fe30 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
2fe40 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
2fe50 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2fe60 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
2fe70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2fe80 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2fe90 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2fea0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
2feb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fec0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2fed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fee0 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
2fef0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2ff00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
2ff10 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
2ff20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
2ff30 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
2ff40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ff50 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
2ff60 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
2ff70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ff80 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
2ff90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2ffa0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ffc0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2ffd0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2ffe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fff0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
30000 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
30010 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
30020 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
30030 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
30040 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
30050 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
30060 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
30070 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
30080 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
30090 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72  ** its has a zer
300a0 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
300b0 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
300c0 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
300d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
300e0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
300f0 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
30100 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
30110 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
30120 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
30130 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
30140 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
30150 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
30160 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
30170 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
30180 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
30190 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
301a0 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
301b0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
301c0 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
301d0 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
301e0 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
301f0 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
30200 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
30210 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
30220 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
30230 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
30240 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
30250 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
30260 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
30270 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
30280 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
30290 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
302a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
302b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
302c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
302d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
302e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
302f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
30300 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
30310 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
30320 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30330 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  abase file..** I
30340 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
30350 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
30360 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c  rAcquire() until
30370 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
30380 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
30390 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
303a0 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
303b0 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
303c0 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
303d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
303e0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
303f0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
30400 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
30410 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
30420 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
30430 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
30440 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
30450 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
30460 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
30470 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
30480 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
30490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
304a0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
304b0 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
304c0 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
304d0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
304e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
304f0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
30500 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
30510 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
30520 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
30530 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
30540 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30550 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
30560 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
30570 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
30580 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
30590 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
305a0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
305b0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
305c0 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
305d0 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
305e0 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
305f0 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
30600 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30610 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
30620 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
30630 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
30640 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
30650 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
30660 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
30670 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
30680 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
30690 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
306a0 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
306b0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
306c0 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
306d0 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
306e0 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
306f0 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
30700 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
30710 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
30720 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
30730 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
30740 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
30750 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
30760 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
30770 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
30780 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
30790 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
307a0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
307b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
307c0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
307d0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
307e0 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
307f0 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
30800 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
30810 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
30820 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
30830 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
30840 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
30850 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
30860 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
30870 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
30880 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
308b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
308c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
308d0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
308e0 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
308f0 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
30900 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
30910 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
30920 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
30930 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
30940 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
30950 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
30960 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
30970 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
30980 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
30990 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
309a0 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
309b0 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ss mode..  */.  
309c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
309d0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
309e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
309f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
30a00 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
30a10 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
30a20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30a30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30a40 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
30a50 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
30a60 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  R );.  if( NEVER
30a70 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
30a80 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
30a90 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
30aa0 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21  Code; }..  if( !
30ab0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30ac0 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65  er) && pPager->e
30ad0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30ae0 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f  N ){.    int bHo
30af0 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20  tJournal = 1;   
30b00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30b10 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
30b20 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   hot journal-fil
30b30 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
30b40 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20  ( !MEMDB );..   
30b50 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
30b60 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
30b70 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
30b80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
30ba0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
30bb0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
30bc0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
30bd0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
30be0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
30bf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
30c00 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
30c10 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
30c20 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
30c30 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
30c40 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
30c50 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
30c60 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
30c70 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
30c80 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
30c90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
30ca0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
30cb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
30cc0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
30cd0 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e  ager, &bHotJourn
30ce0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
30cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30d00 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
30d10 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
30d20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   if( bHotJournal
30d30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
30d40 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
30d50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
30d60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
30d70 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
30d80 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
30d90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
30da0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
30db0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30dc0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
30dd0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
30de0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
30df0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
30e00 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
30e10 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
30e20 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
30e30 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
30e40 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
30e50 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
30e60 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
30e70 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
30e80 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
30e90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
30ea0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
30eb0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
30ec0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
30ed0 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
30ee0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
30ef0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
30f00 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
30f10 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
30f20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
30f30 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
30f40 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
30f50 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
30f60 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
30f70 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
30f80 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
30f90 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
30fa0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
30fb0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
30fc0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
30fd0 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
30fe0 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
30ff0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
31000 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
31010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31020 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31030 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
31040 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e  ger is in lockin
31050 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
31060 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
31070 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e  is.      ** down
31080 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44  graded to SHARED
31090 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69  _LOCK before thi
310a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
310b0 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ns..      */.   
310c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
310d0 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
310e0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
310f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31110 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31120 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31130 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
31140 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68  eady open and th
31150 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e  e file exists on
31160 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20   disk, open the 
31170 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
31180 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
31190 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61   access. Write a
311a0 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65  ccess is require
311b0 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20  d because .     
311c0 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65   ** in exclusive
311d0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
311e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
311f0 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
31200 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  en .      ** and
31210 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
31220 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
31230 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c   later on. Also,
31240 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20   write-access . 
31250 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c       ** is usual
31260 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  ly required to f
31270 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
31280 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  nal in journal_m
31290 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20  ode=persist .   
312a0 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20     ** mode (and 
312b0 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  also for journal
312c0 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f  _mode=truncate o
312d0 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e  n some systems).
312e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
312f0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
31300 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
31310 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
31320 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
31330 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
31340 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
31350 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
31360 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
31370 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  e .      ** this
31380 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
31390 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
313a0 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
313b0 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  r, it .      ** 
313c0 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  may mean that th
313d0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74  e pager was in t
313e0 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
313f0 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a  hen this.      *
31400 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
31410 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
31420 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
31430 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
31440 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
31450 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
31460 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
31470 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
31480 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
31490 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69  >pVfs;.        i
314a0 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20  nt bExists;     
314b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
314c0 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
314d0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
314e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
314f0 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
31500 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
31510 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
31520 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
31530 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20  S, &bExists);.  
31540 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31550 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
31560 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ts ){.          
31570 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
31580 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
31590 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
315a0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
315b0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
315c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
315d0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
315e0 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
315f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
31600 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
31610 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31620 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
31630 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
31640 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31650 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
31660 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
31670 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31680 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
31690 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
316a0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
316b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
316c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
316d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
316e0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
316f0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31710 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
31720 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
31730 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
31740 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
31750 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
31760 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
31770 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
31780 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
31790 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
317a0 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
317b0 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
317c0 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
317d0 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
317e0 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
317f0 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
31800 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
31810 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31820 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
31830 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
31840 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
31850 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
31860 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
31870 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
31880 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
31890 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
318a0 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
318b0 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
318c0 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
318d0 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
318e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
318f0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
31900 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31910 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
31920 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
31930 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
31940 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
31950 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
31960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31980 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
31990 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
319a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
319b0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
319c0 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
319d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
319e0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
319f0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
31a00 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
31a10 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31a20 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
31a30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31a50 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
31a60 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
31a70 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
31a80 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
31a90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
31aa0 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
31ab0 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
31ac0 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
31ad0 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
31ae0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
31af0 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
31b00 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
31b10 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
31b20 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
31b30 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
31b40 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
31b50 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
31b60 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
31b70 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
31b80 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
31b90 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
31ba0 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
31bb0 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
31bc0 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
31bd0 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
31be0 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
31bf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31c00 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
31c10 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
31c20 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
31c30 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
31c40 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
31c50 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
31c60 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
31c70 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
31c80 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
31c90 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
31ca0 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
31cb0 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
31cc0 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
31cd0 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
31ce0 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
31cf0 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
31d00 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
31d10 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
31d20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
31d30 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
31d40 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
31d50 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
31d60 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
31d70 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
31d80 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
31d90 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
31da0 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
31db0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
31dc0 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
31dd0 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
31de0 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
31df0 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
31e00 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
31e10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31e20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
31e30 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
31e40 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
31e50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31e60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31e70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
31e80 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
31e90 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
31ea0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
31eb0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
31ec0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31ed0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
31ee0 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
31ef0 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
31f00 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
31f10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
31f20 20 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   (.        pPage
31f30 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20 20 20 20  r->pBackup .    
31f40 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
31f50 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
31f60 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20  r->pPCache)>0 . 
31f70 20 20 20 20 7c 7c 20 55 53 45 46 45 54 43 48 28      || USEFETCH(
31f80 70 50 61 67 65 72 29 0a 20 20 20 20 29 29 7b 0a  pPager).    )){.
31f90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
31fa0 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
31fb0 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
31fc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31fd0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  file.      ** an
31fe0 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
31ff0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
32000 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
32010 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a  revious.      **
32020 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
32030 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
32040 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
32050 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
32060 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
32070 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
32080 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
32090 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
320a0 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
320b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
320c0 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
320d0 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
320e0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
320f0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
32100 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
32110 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
32120 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
32130 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
32140 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
32150 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
32160 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
32170 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
32180 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
32190 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
321a0 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
321b0 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
321c0 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
321d0 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
321e0 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
321f0 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
32200 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
32210 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
32220 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
32230 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
32240 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
32250 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
32260 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
32270 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
32280 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
32290 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
322a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
322b0 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20  gno nPage = 0;. 
322c0 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
322d0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
322e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
322f0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ;..      rc = pa
32300 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32310 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
32320 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
32330 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20  o failed;..     
32340 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
32350 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
32360 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
32370 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
32380 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
32390 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
323a0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
323b0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
323c0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
323d0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
323e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
323f0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
32400 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
32410 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
32420 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32450 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
32460 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
32470 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
32480 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
32490 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
324a0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
324b0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
324c0 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
324d0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
324e0 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
324f0 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
32500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32510 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
32520 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
32530 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
32540 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
32550 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
32560 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
32570 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
32580 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
32590 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
325a0 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
325b0 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
325c0 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
325d0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
325e0 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
325f0 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
32600 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
32610 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
32620 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
32630 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
32640 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
32650 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
32660 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
32670 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
32680 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
32690 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
326a0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
326b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
326c0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
326d0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
326e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
326f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
32700 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
32710 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
32720 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
32730 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
32740 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
32750 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
32760 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
32770 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
32780 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
32790 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
327a0 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
327b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
327c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
327d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
327e0 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
327f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
32800 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
32810 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
32820 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
32830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32840 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
32850 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
32860 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
32870 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
32880 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32890 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
328a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
328b0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
328c0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
328d0 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
328e0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
328f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32900 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
32910 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
32920 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
32930 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32940 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32950 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
32960 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
32970 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
32980 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
32990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
329a0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
329b0 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
329c0 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
329d0 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
329e0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
329f0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
32a00 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
32a10 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
32a20 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
32a30 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
32a40 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
32a50 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
32a60 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
32a70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
32a80 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
32a90 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
32aa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
32ab0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
32ac0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
32ad0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
32ae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
32af0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  if( pPager->nMma
32b00 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69  pOut==0 && (sqli
32b10 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
32b20 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
32b30 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61  e)==0) ){.    pa
32b40 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
32b50 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
32b60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
32b70 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
32b80 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
32b90 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
32ba0 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
32bb0 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
32bc0 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
32bd0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
32be0 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
32bf0 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
32c00 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
32c10 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
32c20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
32c30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
32c40 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
32c50 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
32c60 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
32c70 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
32c80 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
32c90 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
32ca0 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
32cb0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
32cc0 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
32cd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
32ce0 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
32cf0 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
32d00 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
32d10 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
32d20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
32d30 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
32d40 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
32d50 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
32d60 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
32d70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
32d80 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
32d90 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
32da0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
32db0 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
32dc0 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
32dd0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
32de0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
32df0 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
32e00 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
32e10 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
32e20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
32e30 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
32e40 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
32e50 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
32e60 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
32e70 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
32e80 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
32e90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
32ea0 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
32eb0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
32ec0 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
32ed0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
32ee0 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
32ef0 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
32f00 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
32f10 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
32f20 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
32f30 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
32f40 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
32f50 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
32f60 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
32f70 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
32f80 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
32f90 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
32fa0 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
32fb0 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
32fc0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
32fd0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
32fe0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
32ff0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
33000 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
33010 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
33020 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
33030 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
33040 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
33050 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
33060 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
33070 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
33080 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
33090 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
330a0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
330b0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
330c0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
330d0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
330e0 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
330f0 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
33100 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
33110 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
33120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
33130 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
33140 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
33150 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
33160 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
33170 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
33180 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
33190 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
331a0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
331b0 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
331c0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
331d0 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
331e0 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
331f0 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
33200 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
33210 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
33220 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
33230 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
33240 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
33250 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
33260 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
33270 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
33280 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
33290 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
332a0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
332b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
332c0 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
332d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
332e0 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
332f0 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
33300 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
33310 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
33320 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
33330 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
33340 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
33350 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
33360 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
33370 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
33380 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
33390 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
333a0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
333b0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
333c0 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
333d0 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
333e0 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
333f0 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
33400 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
33410 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
33420 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
33430 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
33440 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
33450 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
33460 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
33470 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
33480 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
33490 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
334a0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
334b0 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
334c0 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
334d0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
334e0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
334f0 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
33500 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
33510 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
33520 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
33530 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
33540 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
33550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33560 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
33570 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
33580 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
33590 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
335a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
335b0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
335c0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
335d0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
335e0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
335f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
33600 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
33610 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
33620 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
33630 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58   /* PAGER_GET_XX
33640 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
33650 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33660 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
33670 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61   = 0;.  u32 iFra
33680 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
33690 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
336a0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41   to read from WA
336b0 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  L file */.  cons
336c0 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20  t int noContent 
336d0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
336e0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b  _GET_NOCONTENT);
336f0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
33700 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
33710 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
33720 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
33730 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
33740 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
33750 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
33760 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
33770 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
33780 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
33790 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
337a0 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
337b0 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
337c0 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
337d0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
337e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
337f0 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
33800 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
33810 6f 21 3d 31 20 26 26 20 55 53 45 46 45 54 43 48  o!=1 && USEFETCH
33820 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20 28  (pPager).   && (
33830 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33840 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
33850 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
33860 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69  ET_READONLY)).#i
33870 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
33880 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67  CODEC.   && pPag
33890 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65  er->xCodec==0.#e
338a0 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73  ndif.  );..  ass
338b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
338c0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
338d0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
338e0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
338f0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
33900 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74  ssert( noContent
33910 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d  ==0 || bMmapOk==
33920 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  0 );..  if( pgno
33930 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
33940 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33950 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
33960 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
33970 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
33980 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ate, return an e
33990 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  rror immediately
339a0 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
339b0 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70  e, request the p
339c0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61  age from the PCa
339d0 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20  che layer. */.  
339e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
339f0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
33a00 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
33a10 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
33a20 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d  lse{.    if( bMm
33a30 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65  apOk && pagerUse
33a40 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
33a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33a60 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
33a70 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
33a80 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
33a90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33aa0 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
33ab0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
33ac0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d    }..    if( bMm
33ad0 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d  apOk && iFrame==
33ae0 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  0 ){.      void 
33af0 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20  *pData = 0;..   
33b00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33b10 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  sFetch(pPager->f
33b20 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69  d, .          (i
33b30 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
33b40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
33b50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
33b60 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20 29  , &pData.      )
33b70 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
33b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
33b90 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ata ){.        i
33ba0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
33bb0 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  e>PAGER_READER )
33bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 20  {.          pPg 
33bd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
33be0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
33bf0 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
33c00 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
33c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
33c20 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 4d   = pagerAcquireM
33c30 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  apPage(pPager, p
33c40 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67  gno, pData, &pPg
33c50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33c60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33c70 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
33c80 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
33c90 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
33ca0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
33cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33cc0 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
33cd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33cf0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  .          *ppPa
33d00 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ge = pPg;.      
33d10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33d20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
33d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33d40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33d50 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
33d60 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33d70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
33d80 0a 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71  ..    {.      sq
33d90 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
33da0 65 20 2a 70 42 61 73 65 3b 0a 20 20 20 20 20 20  e *pBase;.      
33db0 70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50  pBase = sqlite3P
33dc0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
33dd0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
33de0 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 3);.      if( 
33df0 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pBase==0 ){.    
33e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33e10 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
33e20 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
33e30 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
33e40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
33e60 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33e70 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
33e80 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
33e90 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
33ea0 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61  eFetchFinish(pPa
33eb0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
33ec0 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 20 20  no, pBase);.    
33ed0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
33ee0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
33ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
33f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33f10 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
33f20 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
33f30 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33f40 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
33f50 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
33f60 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
33f70 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
33f80 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
33f90 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
33fa0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
33fb0 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
33fc0 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
33fd0 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
33fe0 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
33ff0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34000 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
34010 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
34020 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
34030 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
34040 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70  Page)->pPager==p
34050 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67  Pager || (*ppPag
34060 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  e)->pPager==0 );
34070 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ..  if( (*ppPage
34080 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  )->pPager && !no
34090 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
340a0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
340b0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
340c0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
340d0 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
340e0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
340f0 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
34100 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
34110 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
34120 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
34130 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
34140 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
34150 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
34160 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
34170 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72  AT_HIT]++;.    r
34180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34190 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
341a0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
341b0 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
341c0 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
341d0 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
341e0 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
341f0 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20  lized.  */..    
34200 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20  pPg = *ppPage;. 
34210 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
34220 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a   pPager;..    /*
34230 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
34240 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
34250 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
34260 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
34270 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
34280 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
34290 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64  s, or the unused
342a0 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69   locking-page, i
342b0 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  s requested. */.
342c0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
342d0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
342e0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
342f0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
34300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34310 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34320 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34330 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34340 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
34350 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
34360 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  ze<pgno || noCon
34370 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
34380 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
34390 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
343a0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
343b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
343c0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
343d0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
343e0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
343f0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
34400 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
34410 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
34420 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
34430 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
34440 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
34450 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
34460 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
34470 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
34480 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
34490 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
344a0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
344b0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
344c0 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
344d0 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
344e0 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
344f0 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
34500 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
34510 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
34520 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
34530 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
34540 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
34550 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
34560 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
34570 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
34580 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
34590 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
345a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
345b0 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
345c0 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
345d0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
345e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
345f0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
34600 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
34610 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34630 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
34640 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
34650 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
34660 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
34670 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
34680 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34690 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
346a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
346b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
346c0 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
346d0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
346e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
346f0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
34700 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
34710 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
34720 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
34730 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
34740 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20   bMmapOk==0 ){. 
34750 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34760 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
34770 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
34780 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
34790 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
347a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
347b0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
347c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
347d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
347e0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
347f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
34800 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
34810 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
34820 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
34830 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
34840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
34860 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34870 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
34880 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
34890 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
348a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
348b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
348c0 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
348d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
348e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
348f0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
34900 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
34910 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
34920 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
34930 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
34940 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
34950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
34960 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
34970 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
34980 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
34990 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
349a0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
349b0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
349c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
349d0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
349e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
349f0 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
34a00 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
34a10 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
34a20 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
34a30 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
34a40 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
34a50 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
34a60 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
34a70 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
34a80 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
34a90 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
34aa0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
34ab0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
34ac0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
34ad0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
34ae0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
34af0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
34b00 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
34b10 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
34b20 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
34b30 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
34b40 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
34b50 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73   Pgno pgno){.  s
34b60 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
34b70 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
34b80 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
34b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
34ba0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
34bb0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
34bc0 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
34bd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34be0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
34bf0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20  che, pgno, 0);. 
34c00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34c10 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
34c20 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34c30 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a  , pgno, pPage);.
34c40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
34c50 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
34c60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
34c70 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
34c80 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
34c90 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
34ca0 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
34cb0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
34cc0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
34cd0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
34ce0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
34cf0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
34d00 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
34d10 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
34d20 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
34d30 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
34d40 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
34d50 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
34d60 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
34d70 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73  r *pPager;.  ass
34d80 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
34d90 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
34da0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
34db0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
34dc0 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65  MMAP ){.    page
34dd0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
34de0 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
34df0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
34e00 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
34e10 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
34e20 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
34e30 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
34e40 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
34e50 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
34e60 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
34e70 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
34e80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
34e90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
34ea0 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
34eb0 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
34ec0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
34ed0 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
34ee0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
34ef0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
34f00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
34f10 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
34f20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
34f30 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
34f40 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
34f50 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
34f60 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
34f70 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
34f80 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
34f90 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
34fa0 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
34fb0 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
34fc0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
34fd0 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
34fe0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
34ff0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
35000 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
35010 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
35020 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
35030 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
35040 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
35050 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
35060 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
35070 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
35080 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
35090 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
350a0 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
350b0 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
350c0 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
350d0 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
350e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
350f0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
35100 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
35110 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
35120 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
35130 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
35140 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
35150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
35160 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
35170 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
35180 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35190 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
351a0 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
351b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
351c0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
351d0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
351e0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
351f0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
35200 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
35210 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
35220 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
35230 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
35240 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
35250 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
35260 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
35270 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
35280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
35290 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
352a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
352b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
352c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
352d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
352e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
352f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
35300 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
35310 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
35320 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
35330 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
35340 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35350 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35360 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35370 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
35380 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
35390 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
353a0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
353b0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
353c0 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
353d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
353e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
353f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
35400 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
35410 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
35420 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
35430 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
35440 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
35450 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
35460 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
35470 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
35480 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
35490 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
354a0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
354b0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
354c0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
354d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
354e0 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
354f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
35500 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
35510 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
35520 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
35530 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
35540 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
35550 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
35560 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
35570 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
35580 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
35590 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
355a0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
355b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
355c0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
355d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
355e0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
355f0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
35600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
35610 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
35620 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
35630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35640 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
35650 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
35660 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
35670 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
35680 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
35690 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
356a0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
356b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
356c0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
356d0 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
356e0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
356f0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
35700 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
35710 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
35720 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
35730 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
35740 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
35750 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56  );..        /* V
35760 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
35770 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61  atabase still ha
35780 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
35790 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20  as it did when. 
357a0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73         ** it was
357b0 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
357c0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ed. */.        r
357d0 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e  c = databaseIsUn
357e0 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20  moved(pPager);. 
357f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
35800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64  QLITE_OK ){.#ifd
35810 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35820 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
35830 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35840 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
35850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
35860 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
35870 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
35880 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
35890 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
358a0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23  ).          );.#
358b0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72  else.          r
358c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
358d0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
358e0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
358f0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
35900 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
35910 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35920 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35930 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
35940 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
35950 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20  .    }.  .  .   
35960 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
35970 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
35980 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
35990 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
359a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
359b0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
359c0 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
359d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
359e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
359f0 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
35a00 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
35a10 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
35a20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
35a30 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
35a40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35a50 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
35a60 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
35a70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
35a80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
35a90 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
35aa0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
35ab0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
35ac0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
35ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
35ae0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
35af0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
35b00 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
35b10 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
35b20 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
35b30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35b40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35b50 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35b60 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
35b70 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
35b80 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a  R_CACHEMOD;.  }.
35b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35ba0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
35bb0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35bc0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
35bd0 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
35be0 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
35bf0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
35c00 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
35c10 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
35c20 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
35c30 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
35c40 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
35c50 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
35c60 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
35c70 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
35c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35c90 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
35ca0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
35cb0 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
35cc0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
35cd0 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
35ce0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
35cf0 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
35d00 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
35d10 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
35d20 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
35d30 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
35d40 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
35d50 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
35d60 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
35d70 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
35d80 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
35d90 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
35da0 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
35db0 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
35dc0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
35dd0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
35de0 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
35df0 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
35e00 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
35e10 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
35e20 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
35e30 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
35e40 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
35e50 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
35e60 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
35e70 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
35e80 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
35e90 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
35ea0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
35eb0 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
35ec0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
35ed0 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
35ee0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
35ef0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
35f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
35f10 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
35f20 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
35f30 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
35f40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35f50 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
35f60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
35f70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
35f80 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
35f90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35fa0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
35fb0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
35fc0 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
35fd0 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
35fe0 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
35ff0 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
36000 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
36010 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36020 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
36030 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
36040 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a  nJournal==0 );..
36050 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
36060 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
36070 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
36080 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
36090 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
360a0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
360b0 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
360c0 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
360d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
360e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
360f0 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
36100 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
36110 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
36120 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
36130 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
36140 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
36150 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
36160 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36170 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
36180 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
36190 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
361a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
361b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
361c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
361d0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78      sqlite3WalEx
361e0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
361f0 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
36200 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
36210 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
36220 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
36230 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
36240 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
36250 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
36260 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
36270 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
36280 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
36290 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
362a0 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
362b0 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
362c0 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
362d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
362e0 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
362f0 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
36300 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
36310 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
36320 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
36330 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
36340 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
36350 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
36360 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
36370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36380 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45    /* Obtain a RE
36390 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
363a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
363b0 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  . If the exFlag 
363c0 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20  parameter.      
363d0 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
363e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
363f0 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
36400 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
36410 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73  The.      ** bus
36420 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
36430 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
36440 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
36450 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
36460 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75       ** lock, bu
36470 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
36480 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
36490 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  D lock..      */
364a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
364b0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
364c0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
364d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
364e0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61  LITE_OK && exFla
364f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
36500 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
36510 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
36520 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
36530 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
36540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OK ){.      /* C
36560 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f  hange to WRITER_
36570 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20  LOCKED state..  
36580 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
36590 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61  WAL mode sets Pa
365a0 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41  ger.eState to PA
365b0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
365c0 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20  D or CACHEMOD.  
365d0 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68      ** when it h
365e0 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  as an open trans
365f0 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
36600 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49  r to DBMOD or FI
36610 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a  NISHED..      **
36620 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
36630 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73   in those states
36640 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
36650 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  l back savepoint
36660 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
36670 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79  actions may copy
36680 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
36690 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ub-journal into 
366a0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
366b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77      ** file as w
366c0 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20  ell as into the 
366d0 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63  page cache. Whic
366e0 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72  h would be incor
366f0 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a  rect in .      *
36700 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20  * WAL mode..    
36710 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
36720 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
36730 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b  R_WRITER_LOCKED;
36740 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
36750 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
36760 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
36770 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
36780 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36790 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
367a0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
367b0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
367c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
367d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
367e0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
367f0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
36800 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
36810 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
36820 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
36840 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36850 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
36860 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65  CKED );.    asse
36870 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36880 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36890 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
368a0 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
368b0 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
368c0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65  (pPager)));.  re
368d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
368e0 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
368f0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
36900 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
36910 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
36920 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
36930 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
36940 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
36950 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
36960 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
36970 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
36980 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
36990 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
369a0 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
369b0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
369c0 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
369d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
369e0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
369f0 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
36a00 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
36a10 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
36a20 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
36a30 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
36a40 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
36a50 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
36a60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
36a70 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 6e  ITE_OK;.  int in
36a80 4a 6f 75 72 6e 61 6c 3b 0a 0a 20 20 2f 2a 20 54  Journal;..  /* T
36a90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
36aa0 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
36ab0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
36ac0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
36ad0 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
36ae0 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
36af0 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
36b00 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
36b10 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
36b20 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
36b30 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
36b40 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
36b50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36b60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36b70 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
36b80 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
36b90 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36ba0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
36bb0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
36bc0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36bd0 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
36be0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36bf0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
36c00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36c10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
36c20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
36c30 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d  Pager->readOnly=
36c40 3d 30 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  =0 );..  CHECK_P
36c50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
36c60 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
36c70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
36c80 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
36c90 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
36ca0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
36cb0 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
36cc0 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
36cd0 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
36ce0 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
36cf0 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
36d00 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
36d10 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
36d20 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
36d30 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
36d40 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
36d50 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
36d60 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
36d70 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
36d80 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
36d90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
36da0 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
36db0 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
36dc0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36dd0 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
36de0 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
36df0 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
36e00 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
36e10 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
36e20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
36e30 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
36e40 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
36e50 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
36e60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36e70 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
36e80 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
36e90 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
36ea0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
36eb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36ec0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36ed0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
36ee0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
36ef0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
36f00 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
36f10 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
36f20 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
36f30 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
36f40 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
36f50 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
36f60 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
36f70 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
36f80 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
36f90 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
36fa0 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ay..  */.  sqlit
36fb0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36fc0 79 28 70 50 67 29 3b 0a 20 20 69 6e 4a 6f 75 72  y(pPg);.  inJour
36fd0 6e 61 6c 20 3d 20 70 61 67 65 49 6e 4a 6f 75 72  nal = pageInJour
36fe0 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29  nal(pPager, pPg)
36ff0 3b 0a 20 20 69 66 28 20 69 6e 4a 6f 75 72 6e 61  ;.  if( inJourna
37000 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6e 53  l && (pPager->nS
37010 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 21  avepoint==0 || !
37020 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
37030 28 70 50 67 29 29 20 29 7b 0a 20 20 20 20 61 73  (pPg)) ){.    as
37040 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
37050 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
37060 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
37070 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
37080 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
37090 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
370a0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
370b0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
370c0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
370d0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
370e0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
370f0 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
37100 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
37110 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
37120 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
37130 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
37140 20 20 20 69 66 28 20 21 69 6e 4a 6f 75 72 6e 61     if( !inJourna
37150 6c 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  l && !pagerUseWa
37160 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
37170 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
37180 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
37190 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
371a0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
371b0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20  ->dbOrigSize && 
371c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
371d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  fd) ){.        u
371e0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
371f0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
37200 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
37210 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
37220 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20  alOff;..        
37230 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
37240 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
37250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
37260 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
37270 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
37280 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
37290 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
372a0 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
372b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
372c0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
372d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
372e0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
372f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
37300 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
37310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
37320 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d  rnalHdr<=pPager-
37330 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
37340 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
37350 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
37360 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
37370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37380 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
37390 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
373a0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
373b0 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
373c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
373d0 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
373e0 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
373f0 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  rs while journal
37400 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20  ling the.       
37410 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
37420 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
37430 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
37440 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
37450 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  ..        ** Oth
37460 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
37470 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
37480 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
37490 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20   logic in.      
374a0 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
374b0 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
374c0 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
374d0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
374e0 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
374f0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
37500 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
37510 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
37520 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
37530 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
37540 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
37550 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20   follow..       
37560 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d   */.        pPg-
37570 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37580 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20  NEED_SYNC;..    
37590 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
375a0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
375b0 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  , iOff, pPg->pgn
375c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
375d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
375e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
375f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
37600 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
37610 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
37620 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
37630 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69  ff+4);.        i
37640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37650 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37660 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
37670 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
37680 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d  fd, iOff+pPager-
37690 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73  >pageSize+4, cks
376a0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  um);.        if(
376b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
376c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
376d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
376e0 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
376f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
37700 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
37710 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
37720 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
37730 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
37740 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
37750 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
37760 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
37770 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
37780 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
37790 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
377a0 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
377b0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
377c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
377d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
377e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
377f0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37800 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
37810 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
37820 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
37830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37840 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65  Off += 8 + pPage
37850 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
37860 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
37870 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
37880 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37890 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
378a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
378b0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
378c0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
378d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
378e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
378f0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
37900 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37920 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
37930 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
37940 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
37950 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
37960 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
37970 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
379a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
379b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
379c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
379d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
379e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
379f0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
37a00 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
37a10 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
37a20 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
37a30 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
37a40 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
37a50 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
37a60 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
37a70 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
37a80 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
37a90 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
37aa0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
37ab0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
37ac0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37ad0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20  C)?1:0)));.     
37ae0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
37af0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
37b00 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
37b10 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
37b20 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
37b30 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
37b40 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
37b50 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
37b60 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
37b70 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
37b80 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
37b90 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
37ba0 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
37bb0 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
37bc0 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
37bd0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
37be0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
37bf0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
37c00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
37c10 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 26 26  >nSavepoint>0 &&
37c20 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
37c30 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
37c40 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
37c50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
37c60 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
37c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
37c80 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
37c90 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
37ca0 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
37cb0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
37cc0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
37cd0 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
37ce0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37cf0 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e  This is a varian
37d00 74 20 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65  t of sqlite3Page
37d10 72 57 72 69 74 65 28 29 20 74 68 61 74 20 72 75  rWrite() that ru
37d20 6e 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 74  ns when the sect
37d30 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61  or size.** is la
37d40 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
37d50 67 65 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65  ge size.  SQLite
37d60 20 6d 61 6b 65 73 20 74 68 65 20 28 72 65 61 73   makes the (reas
37d70 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69  onable) assumpti
37d80 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62  on that.** all b
37d90 79 74 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72  ytes of a sector
37da0 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67   are written tog
37db0 65 74 68 65 72 20 62 79 20 68 61 72 64 77 61 72  ether by hardwar
37dc0 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62  e.  Hence, all b
37dd0 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63  ytes of.** a sec
37de0 74 6f 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  tor need to be j
37df0 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73  ournalled in cas
37e00 65 20 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  e of a power los
37e10 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
37e20 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a  of.** a write..*
37e30 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
37e40 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
37e50 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
37e60 75 61 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20  ual to the page 
37e70 73 69 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a  size, in which.*
37e80 2a 20 63 61 73 65 20 70 61 67 65 73 20 63 61 6e  * case pages can
37e90 20 62 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79   be individually
37ea0 20 77 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20   written.  This 
37eb0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e  routine only run
37ec0 73 20 69 6e 20 74 68 65 20 65 78 63 65 70 74 69  s in the excepti
37ed0 6f 6e 61 6c 0a 2a 2a 20 63 61 73 65 20 77 68 65  onal.** case whe
37ee0 72 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  re the page size
37ef0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
37f00 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
37f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
37f20 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
37f30 70 61 67 65 72 57 72 69 74 65 4c 61 72 67 65 53  pagerWriteLargeS
37f40 65 63 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67  ector(PgHdr *pPg
37f50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37f60 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37f70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37f80 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61  de */.  Pgno nPa
37f90 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
37fa0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
37fb0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
37fc0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
37fd0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20   */.  Pgno pg1; 
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ff0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
38000 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
38010 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
38020 6f 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  on. */.  int nPa
38030 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
38040 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38050 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
38060 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
38070 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
38080 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
38090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
380a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
380b0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
380c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
380d0 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
380e0 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
380f0 5f 53 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72  _SYNC */.  Pager
38100 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
38110 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 54 68 65  pPager;   /* The
38120 20 70 61 67 65 72 20 74 68 61 74 20 6f 77 6e 73   pager that owns
38130 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e   pPg */.  Pgno n
38140 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
38150 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
38160 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
38170 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Size);..  /* Set
38180 20 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   the doNotSpill 
38190 4e 4f 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e  NOSYNC bit to 1.
381a0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
381b0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
381c0 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
381d0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
381e0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
381f0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
38200 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   by.  ** this fu
38210 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  nction..  */.  a
38220 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
38230 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
38240 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
38250 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
38260 43 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  C)==0 );.  pPage
38270 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
38280 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
38290 43 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 74 72  C;..  /* This tr
382a0 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
382b0 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
382c0 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
382d0 69 7a 65 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20  ize are.  ** an 
382e0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
382f0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
38300 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
38310 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20  identifier.  ** 
38320 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
38330 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
38340 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
38350 6e 2e 0a 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20  n..  */.  pg1 = 
38360 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
38370 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
38380 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50  r-1)) + 1;..  nP
38390 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65  ageCount = pPage
383a0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28  r->dbSize;.  if(
383b0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
383c0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61  Count ){.    nPa
383d0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
383e0 2d 20 70 67 31 29 2b 31 3b 0a 20 20 7d 65 6c 73  - pg1)+1;.  }els
383f0 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
38400 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
38410 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e  geCount ){.    n
38420 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
38430 74 2b 31 2d 70 67 31 3b 0a 20 20 7d 65 6c 73 65  t+1-pg1;.  }else
38440 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
38450 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
38460 7d 0a 20 20 61 73 73 65 72 74 28 6e 50 61 67 65  }.  assert(nPage
38470 3e 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 67  >0);.  assert(pg
38480 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
38490 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
384a0 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
384b0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
384c0 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
384d0 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
384e0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
384f0 2b 69 69 3b 0a 20 20 20 20 50 67 48 64 72 20 2a  +ii;.    PgHdr *
38500 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  pPage;.    if( p
38510 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
38520 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
38530 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
38540 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
38550 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
38560 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
38570 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
38580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
38590 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
385a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
385b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
385c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
385d0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
385e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
385f0 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
38600 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
38610 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  C ){.           
38620 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
38630 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
38640 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
38650 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
38660 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
38670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
38680 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 73  e if( (pPage = s
38690 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
386a0 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
386b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
386c0 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
386d0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
386e0 20 20