/ Hex Artifact Content
Login

Artifact a3d1b55d4572c229170ddb1589232ae7251f8d28:


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 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
7c70: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
7c80: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
7c90: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
7cf0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
7d00: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
7d10: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
7d20: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
7d30: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
7d40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
7d70: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
7d80: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
7d90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7da0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
7db0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
7dc0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
7dd0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
7de0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
7df0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
7e00: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
7e10: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7e40: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
7e50: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7e70: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
7e80: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
7e90: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
7ea0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7eb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7ec0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
7ef0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
7f00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7f10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7f20: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
7f50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7f60: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
7f70: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
7f80: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
7f90: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
7fa0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
7fb0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
7fc0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
7fd0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
7fe0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7ff0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
8000: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
8010: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
8020: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
8030: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
8040: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
8050: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
8060: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
8070: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
8080: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
8090: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
80a0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
80b0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
80c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
80d0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
80e0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
80f0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
8100: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
8110: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
8120: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ta */.  void (*x
8130: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
8140: 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f  oid*,int,int); /
8150: 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65  * Notify of page
8160: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f   size changes */
8170: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8180: 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20  Free)(void*);   
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
81a0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
81b0: 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20  codec */.  void 
81c0: 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20  *pCodec;        
81d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
81e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
81f0: 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f  ec... methods */
8200: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
8210: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
8220: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
8230: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8240: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
8250: 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  se */.  PCache *
8260: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
8270: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8280: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
8290: 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ect */.#ifndef S
82a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
82b0: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
82e0: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
82f0: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20  _mode=wal" */.  
8300: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
8310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8320: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69  ile name for wri
8330: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a  te-ahead log */.
8340: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8350: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8360: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8370: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8380: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8390: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
83a0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
83b0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
83c0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
83d0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
83e0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
83f0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
8400: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8410: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8420: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8430: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8460: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8470: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8490: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
84a0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
84b0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
84c0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
84d0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
84e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
84f0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
8500: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8510: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8520: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8530: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8540: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8550: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8560: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8570: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8580: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8590: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
85a0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
85b0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
85c0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
85d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
85e0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
85f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8600: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8610: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8620: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8630: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8640: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8650: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8660: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8670: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8680: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8690: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
86a0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
86b0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
86c0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
86d0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
86e0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
86f0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8700: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8710: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8720: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8730: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8740: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8750: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8760: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8770: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8780: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8790: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
87a0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
87b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
87c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
87d0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
87e0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
87f0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8800: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8810: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8820: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8830: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8840: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8850: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8860: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8870: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8880: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8890: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
88a0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
88b0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
88c0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
88d0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
88e0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
88f0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8900: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8910: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8920: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8930: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8940: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8950: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8960: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8970: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8980: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8990: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
89a0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
89b0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
89c0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
89d0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
89e0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
89f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8a00: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8a10: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8a20: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8a30: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8a40: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8a50: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8a60: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8a70: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8a80: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8a90: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8aa0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8ab0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8ad0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8ae0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8af0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8b00: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
8b10: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
8b20: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8b30: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
8b40: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
8b50: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
8b60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
8b70: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
8b80: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
8b90: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
8ba0: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
8bb0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
8bc0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
8bd0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
8be0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8bf0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8c00: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
8c10: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
8c20: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
8c30: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
8c40: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
8c50: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8c60: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
8c70: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
8c80: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
8c90: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
8ca0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
8cb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
8cc0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
8cd0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
8ce0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
8cf0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
8d00: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
8d10: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
8d20: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
8d30: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
8d40: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
8d50: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8d60: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
8d70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
8d80: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
8d90: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
8da0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
8db0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
8dc0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
8dd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
8de0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
8df0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
8e00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
8e10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
8e20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
8e30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
8e40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
8e50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
8e60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
8e70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
8e80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
8e90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
8ea0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
8eb0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
8ec0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
8ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
8ee0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
8ef0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
8f00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
8f10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
8f20: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
8f30: 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 73   this pager uses
8f40: 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c   a write-ahead l
8f50: 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  og instead of th
8f60: 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62  e usual.** rollb
8f70: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68  ack journal. Oth
8f80: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
8f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8fa0: 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20  OMIT_WAL.static 
8fb0: 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c 28  int pagerUseWal(
8fc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8fd0: 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
8fe0: 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65  ->pWal!=0);.}.#e
8ff0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
9000: 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20  erUseWal(x) 0.# 
9010: 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c  define pagerRoll
9020: 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64  backWal(x) 0.# d
9030: 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72  efine pagerWalFr
9040: 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29 20  ames(v,w,x,y,z) 
9050: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9060: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9070: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9090: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
90a0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
90b0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
90c0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
90d0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
90e0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
90f0: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9110: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9120: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9130: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9140: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9150: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9160: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9170: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9180: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9190: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
91a0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
91b0: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
91c0: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
91d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
91e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
91f0: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9200: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9210: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9220: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9230: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9240: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9250: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9260: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9270: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9280: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9290: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
92a0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
92b0: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
92c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92d0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
92e0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
92f0: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9300: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9310: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9320: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9330: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9340: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9350: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9360: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9370: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9380: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9390: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
93a0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
93b0: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
93c0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
93d0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
93e0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
93f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9410: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9420: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9430: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9440: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9450: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9460: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9470: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9480: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9490: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
94a0: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
94b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
94c0: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
94d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
94e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
94f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9500: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9520: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9530: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9540: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9550: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9560: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9570: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9580: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9590: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
95a0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
95b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
95c0: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
95d0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
95e0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
95f0: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9600: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9610: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9620: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9630: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9640: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9650: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9660: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9670: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9680: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9690: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
96a0: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
96c0: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
96d0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
96e0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
96f0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9700: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9710: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9720: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9730: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9750: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9760: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9770: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9780: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9790: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
97a0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
97b0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
97c0: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
97d0: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
97e0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
97f0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9800: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9810: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9820: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9830: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9840: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9850: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9860: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9870: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9880: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9890: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
98a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
98b0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
98c0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
98d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
98e0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
98f0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9900: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9910: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9920: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9930: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9940: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9950: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9960: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9970: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9980: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9990: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
99a0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
99b0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
99c0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
99d0: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
99e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
99f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9a00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9a10: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9a20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9a40: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9a50: 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c  CK || p->noReadl
9a60: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ock );.      bre
9a70: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9a80: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9a90: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9aa0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ab0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ad0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9ae0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9af0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9b00: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9b10: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b20: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9b30: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9b40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9b50: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
9b60: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
9b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9b80: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9b90: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9ba0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9bb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9bc0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9bd0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9be0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9bf0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
9c00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9c10: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9c20: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
9c30: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
9c40: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9c50: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9c60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9c70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9c80: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9c90: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ca0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9cb0: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
9cc0: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
9cd0: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
9ce0: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
9cf0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
9d00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
9d10: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
9d20: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
9d30: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
9d40: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
9d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
9d60: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
9d70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
9d80: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
9d90: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
9da0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9db0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9dc0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9dd0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  CK );.        as
9de0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9df0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9e00: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9e10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9e20: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9e30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9e40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9e50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
9e60: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
9e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9e80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9e90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ea0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ec0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9ed0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ee0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
9ef0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9f00: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9f10: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9f20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9f30: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
9f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9f50: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9f60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9f70: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
9f80: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
9f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9fa0: 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f  Lock>=EXCLUSIVE_
9fb0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9fc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
9fd0: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
9fe0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9ff0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a000: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a010: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a020: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a030: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a040: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
a050: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a060: 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65  bOrigSize<=pPage
a070: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a090: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a0a0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20  ITER_FINISHED:. 
a0b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a0c0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a0d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a0e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a0f0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a100: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a110: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a120: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a130: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a140: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a150: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a160: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a170: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a180: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a190: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a1a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a1b0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a1c0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1d0: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
a1e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
a1f0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
a200: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
a210: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a220: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
a230: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
a240: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
a250: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
a260: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
a270: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
a280: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
a290: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a2a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a2b0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
a2c0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a2d0: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a2e0: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a2f0: 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20  >pPCache)>0 );. 
a300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a310: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a320: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
a330: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
a340: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
a350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a360: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
a370: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
a380: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
a390: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
a3a0: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
a3b0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
a3c0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a3d0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
a3e0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
a3f0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
a400: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
a410: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
a420: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
a430: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
a440: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
a450: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
a460: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
a470: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
a480: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
a490: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
a4a0: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
a4b0: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
a4c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a4d0: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
a4e0: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
a4f0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
a500: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
a510: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
a520: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
a530: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
a540: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
a550: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
a560: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
a570: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
a580: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
a590: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
a5a0: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
a5b0: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
a5c0: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
a5d0: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
a5e0: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
a5f0: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
a600: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
a610: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
a620: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
a630: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
a640: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
a650: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
a660: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
a670: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
a680: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
a690: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a6a0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
a6b0: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
a6c0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a6d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a6e0: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
a6f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
a700: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a710: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a720: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
a730: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
a740: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a750: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a760: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
a770: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
a780: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a790: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a7a0: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
a7b0: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
a7c0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7d0: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
a7e0: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
a7f0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
a800: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
a810: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
a820: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
a830: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
a840: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a850: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
a860: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
a870: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a880: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a890: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
a8a0: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
a8b0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
a8c0: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
a8d0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a8e0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
a8f0: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
a900: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
a910: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
a920: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
a930: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
a940: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
a950: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a960: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a970: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
a980: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
a990: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a9a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
a9b0: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
a9c0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
a9d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a9e0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
a9f0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
aa00: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aa10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aa20: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
aa30: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
aa40: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
aa50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa60: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
aa70: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
aa80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aa90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aaa0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
aab0: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
aac0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
aad0: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
aae0: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
aaf0: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
ab00: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
ab10: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
ab20: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
ab30: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
ab40: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
ab50: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
ab60: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
ab70: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
ab80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
ab90: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
aba0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
abb0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
abc0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
abd0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
abe0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
abf0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
ac00: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
ac10: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
ac20: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
ac30: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
ac40: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
ac50: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
ac60: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
ac70: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
ac80: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
ac90: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
aca0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
acb0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
acc0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
acd0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ace0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
acf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ad00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ad10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
ad20: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
ad30: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
ad40: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ad50: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
ad60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
ad70: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
ad80: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
ad90: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
ada0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
adb0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
adc0: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
add0: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
ade0: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
adf0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
ae00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ae10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ae20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ae30: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
ae40: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
ae50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
ae60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ae70: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
ae80: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
ae90: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
aea0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
aeb0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
aec0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
aed0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
aee0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
aef0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
af00: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
af10: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
af20: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
af30: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
af40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
af50: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
af60: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
af70: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
af80: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
af90: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
afa0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
afb0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
afd0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
afe0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
aff0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
b000: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
b010: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
b020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b030: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
b040: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
b050: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
b070: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
b080: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
b090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b0a0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b0b0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
b0c0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
b0d0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
b0e0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
b0f0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
b100: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
b110: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
b120: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b130: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b140: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
b150: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
b160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
b170: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
b180: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b190: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b1a0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
b1b0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
b1c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b1d0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b1e0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
b1f0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
b200: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
b210: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
b220: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
b230: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
b240: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b250: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b260: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b270: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b280: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
b290: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
b2a0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
b2b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
b2c0: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
b2d0: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
b2e0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
b2f0: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
b300: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
b310: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
b320: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
b330: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
b340: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
b350: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
b360: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
b370: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b380: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
b390: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b3a0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
b3b0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
b3c0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b3d0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b3e0: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
b3f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b400: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b410: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b420: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
b430: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b440: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
b450: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
b460: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
b470: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
b480: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b490: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
b4a0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
b4b0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
b4c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
b4d0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b4e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b4f0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
b500: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ck );.    rc = s
b510: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
b520: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b530: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b540: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b550: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
b560: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b570: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
b580: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b590: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
b5a0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b5b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
b5d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b5e0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b5f0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b600: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
b610: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
b620: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
b630: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
b640: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
b650: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
b660: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
b670: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
b680: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
b690: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b6a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b6b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b6c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b6d0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
b6e0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
b6f0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
b700: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
b710: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
b720: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
b730: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
b740: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
b750: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b760: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
b770: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
b780: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
b790: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
b7a0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
b7b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b7c0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
b7d0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
b7e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
b7f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
b800: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b810: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
b820: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
b830: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
b840: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
b850: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
b860: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
b870: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
b880: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b890: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
b8a0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b8b0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
b8c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
b8d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b8e0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b8f0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
b900: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
b910: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
b920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b930: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
b950: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
b960: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
b970: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
b980: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
b990: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
b9a0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
b9b0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
b9c0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
b9d0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
b9e0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
b9f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ba00: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
ba10: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
ba20: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
ba30: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
ba40: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
ba50: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
ba60: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
ba70: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
ba80: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
ba90: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
baa0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
bab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
bac0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
bad0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
bae0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
baf0: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
bb00: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
bb10: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
bb20: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
bb30: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
bb40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
bb50: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
bb60: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
bb70: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
bb80: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
bb90: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
bba0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
bbb0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
bbc0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
bbd0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
bbe0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
bbf0: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
bc00: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bc10: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
bc20: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
bc30: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
bc40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bc50: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
bc60: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
bc70: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bc80: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
bcb0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
bcc0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
bcd0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
bcf0: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
bd00: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
bd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
bd40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
bd50: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
bd60: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
bd70: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
bd80: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
bd90: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
bda0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
bdb0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
bdc0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
bdd0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
bde0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
bdf0: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
be00: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
be10: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
be20: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
be30: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
be40: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
be50: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
be60: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
be70: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
be80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
be90: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
bea0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
beb0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
bec0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
bed0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
bee0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
bef0: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
bf00: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
bf10: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
bf20: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
bf30: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
bf40: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
bf50: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
bf60: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
bf70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
bf80: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
bf90: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
bfa0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
bfb0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
bfc0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
bfd0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
bfe0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
bff0: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c000: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c010: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c020: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c030: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c040: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c050: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c060: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c070: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c080: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c090: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
c0a0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
c0b0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
c0c0: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
c0d0: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
c0e0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
c0f0: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
c100: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c110: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
c120: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
c130: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
c140: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
c150: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
c160: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
c170: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
c180: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c190: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
c1a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
c1b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
c1c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c1d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
c1e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
c1f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
c200: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
c210: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
c220: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
c230: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
c240: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
c250: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
c260: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
c270: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
c280: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
c290: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c2a0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
c2b0: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
c2c0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
c2d0: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
c2e0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
c2f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
c300: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
c310: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
c320: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
c330: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
c340: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
c350: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c360: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
c370: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
c380: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
c390: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
c3a0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
c3b0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
c3c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
c3d0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
c3e0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
c3f0: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
c400: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
c410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c420: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
c430: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c440: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
c450: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
c460: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
c470: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
c480: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
c490: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
c4a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
c4b0: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
c4c0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
c4d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c4e0: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
c4f0: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
c500: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
c510: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
c520: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
c530: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
c540: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
c550: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
c560: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
c570: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
c580: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
c590: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
c5a0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
c5b0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
c5c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
c5d0: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
c5e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
c5f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c600: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
c610: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
c620: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
c630: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
c640: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
c650: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
c660: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
c670: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
c680: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
c690: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
c6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c6b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
c6c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c6d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
c6e0: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
c6f0: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
c700: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
c710: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
c720: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
c730: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
c740: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
c750: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
c760: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
c770: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
c780: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
c790: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
c7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c7b0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
c7c0: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
c7d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
c7e0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
c7f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
c800: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
c810: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
c820: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
c830: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
c840: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c850: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
c860: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
c870: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
c880: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
c890: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
c8a0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c8d0: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
c900: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
c910: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
c920: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c940: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
c950: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
c960: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
c970: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
c990: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
c9a0: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
c9b0: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
c9e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
c9f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
ca00: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
ca10: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
ca20: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
ca30: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
ca40: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
ca50: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ca60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ca70: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
ca80: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
ca90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
caa0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
cab0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
cac0: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
cad0: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
cae0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
caf0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
cb00: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
cb10: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cb20: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cb30: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
cb40: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
cb50: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
cb60: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
cb70: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
cb80: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
cb90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
cba0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
cbb0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
cbc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cbd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
cbe0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
cbf0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
cc00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cc10: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
cc20: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
cc30: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
cc40: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
cc50: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
cc60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
cc70: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
cc80: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
cc90: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
cca0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
ccb0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
ccc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
ccd0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
cce0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
ccf0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
cd00: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
cd10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
cd20: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
cd30: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
cd40: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
cd50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
cd60: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
cd70: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
cd80: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
cd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cda0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
cdb0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
cdc0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
cdd0: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
cde0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
cdf0: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
ce00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
ce10: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
ce20: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
ce30: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
ce40: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
ce50: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
ce60: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
ce70: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
ce80: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
ce90: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
cf10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
cf20: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
cf30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
cf40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
cf50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
cf60: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
cf70: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
cf80: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
cf90: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
cfa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cfb0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
cfc0: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
cfd0: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
cfe0: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
cff0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d000: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
d010: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
d020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d030: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
d040: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
d050: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
d060: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
d070: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d080: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
d090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
d0a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
d0b0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
d0c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d0d0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d0e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
d0f0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
d100: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
d110: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
d120: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
d130: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
d140: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
d150: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
d160: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
d170: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
d180: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
d190: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d1a0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
d1b0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
d1c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d1d0: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
d1e0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
d1f0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
d200: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
d210: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
d220: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d230: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
d240: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
d250: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
d260: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
d270: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
d280: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
d290: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
d2a0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d2b0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
d2c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d2d0: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
d2e0: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
d2f0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
d300: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d310: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
d320: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
d330: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
d340: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
d350: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
d360: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d370: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
d380: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
d390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d3a0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d3b0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
d3c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d3d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
d3e0: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
d3f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d400: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
d410: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d420: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
d430: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d440: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
d450: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
d460: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
d470: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
d480: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
d490: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
d4a0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
d4b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d4c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d4f0: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
d500: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d510: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
d520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d530: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
d540: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
d550: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
d560: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
d570: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
d580: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
d590: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
d5a0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
d5b0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
d5c0: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
d5d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d5e0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d5f0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
d600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
d610: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
d620: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
d630: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d640: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
d650: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
d660: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
d670: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
d680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d690: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
d6a0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
d6b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
d6c0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
d6d0: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
d6e0: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
d6f0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
d700: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
d710: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
d720: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
d730: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
d740: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
d750: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
d760: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
d770: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
d780: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
d790: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
d7a0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
d7b0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
d7c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
d7d0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
d7e0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
d7f0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
d800: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
d810: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
d820: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
d830: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
d840: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d850: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
d860: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d870: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
d880: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
d890: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d8a0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d8b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
d8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
d8d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
d8e0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
d8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d900: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
d910: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
d920: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d940: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d950: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d960: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
d970: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d980: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
d990: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
d9a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
d9b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
d9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
d9d0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
d9e0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
d9f0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
da00: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
da10: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
da20: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
da30: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
da40: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
da50: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
da60: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
da70: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
da80: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
da90: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
daa0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
dab0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
dac0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
dad0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
dae0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
daf0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
db00: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
db10: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
db20: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
db30: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
db40: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
db50: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
db60: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
db70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
db80: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
db90: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
dba0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
dbb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
dbc0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
dbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbf0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
dc00: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
dc10: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
dc20: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
dc30: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
dc40: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
dc50: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
dc60: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
dc70: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
dc80: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
dc90: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
dca0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
dcd0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
dce0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
dcf0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
dd20: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
dd30: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
dd40: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
dd50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
dd60: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
dd70: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
dd80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
dd90: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
dda0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
ddb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ddc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ddd0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
dde0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ddf0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
de00: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
de10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
de20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
de30: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
de40: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
de50: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
de60: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
de70: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
de80: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
de90: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
dea0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
deb0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
dec0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ded0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
dee0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
def0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
df00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
df10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
df20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
df30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
df40: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
df50: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
df60: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
df70: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
df80: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
df90: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
dfa0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
dfb0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
dfc0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
dfd0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
dfe0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
dff0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
e000: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
e010: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
e030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
e040: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
e050: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
e060: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
e070: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
e080: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
e090: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
e0a0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
e0b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
e0c0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
e0d0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
e0e0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
e0f0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
e100: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
e110: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
e120: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
e130: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
e140: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
e150: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e160: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
e170: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
e180: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
e190: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
e1a0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
e1b0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e1c0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
e1d0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
e1e0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
e1f0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
e200: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
e210: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
e220: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
e230: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
e240: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
e250: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
e260: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
e270: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
e280: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
e290: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
e2a0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
e2b0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
e2c0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
e2d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e2e0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
e2f0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
e300: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
e310: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
e320: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
e330: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e340: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
e350: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e360: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
e370: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
e380: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e390: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
e3a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
e3b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
e3c0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
e3d0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e3e0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
e3f0: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
e400: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e410: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
e420: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
e430: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
e440: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e450: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
e460: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e470: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
e480: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
e490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
e4a0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
e4b0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e4c0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
e4d0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
e4e0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
e4f0: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
e500: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e510: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
e520: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
e530: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
e540: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e550: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e560: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
e570: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e580: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
e590: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
e5a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e5b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e5c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
e5d0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
e5e0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
e5f0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
e600: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
e610: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
e620: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e640: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
e650: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
e660: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
e670: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
e680: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e690: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
e6a0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
e6b0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
e6c0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
e6d0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
e6e0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e6f0: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
e700: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
e710: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e720: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
e730: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
e740: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
e750: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
e760: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
e770: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
e780: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
e790: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
e7a0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
e7b0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
e7c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e7d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
e7e0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
e7f0: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
e800: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
e810: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
e820: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
e830: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
e840: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
e850: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
e860: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
e870: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
e880: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
e890: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
e8a0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
e8b0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
e8c0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
e8d0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
e8e0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
e8f0: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
e900: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
e910: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
e920: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
e930: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
e940: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
e950: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
e960: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
e970: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
e980: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
e990: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
e9a0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
e9b0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
e9c0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
e9d0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
e9e0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
e9f0: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
ea00: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
ea10: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
ea20: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ea30: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
ea40: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ea50: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
ea60: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
ea70: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
ea80: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
ea90: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
eaa0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
eab0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
eac0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
ead0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
eae0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
eaf0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
eb00: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
eb10: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
eb20: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
eb30: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
eb40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
eb50: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
eb60: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
eb70: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
eb80: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
eb90: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
eba0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
ebb0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
ebc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
ebd0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
ebe0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
ebf0: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
ec00: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
ec10: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
ec20: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
ec30: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
ec40: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
ec50: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ec60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
ec70: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
ec80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ec90: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
eca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ecb0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
ecc0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
ecd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ece0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
ecf0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
ed00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ed10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
ed20: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
ed30: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
ed40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ed50: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
ed60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
ed70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
ed80: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
ed90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
eda0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
edb0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
edc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
edd0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
ede0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
edf0: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
ee00: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
ee10: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
ee20: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
ee30: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
ee40: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
ee50: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
ee60: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
ee70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ee80: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ee90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
eea0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
eeb0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
eec0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
eed0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
eee0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
eef0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
ef00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
ef10: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
ef20: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
ef30: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
ef40: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
ef50: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ef60: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
ef70: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ef80: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
ef90: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
efa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
efb0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
efc0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
efd0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
efe0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
eff0: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
f000: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
f010: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
f020: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
f030: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
f040: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f050: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f060: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f070: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
f080: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
f090: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f0a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
f0b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f0c0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
f0d0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
f0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f0f0: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
f100: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
f110: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
f120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f130: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f140: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
f150: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
f160: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
f170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f180: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
f190: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
f1a0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
f1b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f1e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
f1f0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
f200: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
f210: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
f220: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
f230: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
f240: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f250: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f260: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
f270: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
f280: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
f290: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
f2a0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2b0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
f2c0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
f2d0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
f2e0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
f2f0: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
f300: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f310: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
f320: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
f330: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
f340: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
f350: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
f360: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f380: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
f390: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
f3a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f3b0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
f3c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
f3d0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
f3e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f3f0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
f400: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
f410: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
f420: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
f430: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
f440: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f450: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
f460: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
f470: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
f480: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
f490: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
f4a0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
f4b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
f4c0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f4d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
f4e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
f4f0: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
f500: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
f510: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
f520: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
f530: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
f540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
f550: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
f560: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f570: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
f580: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f590: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f5a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
f5b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
f5c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f5d0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
f5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f5f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
f610: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
f620: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
f630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f640: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
f650: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
f660: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
f670: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
f680: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
f690: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
f6a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
f6b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f6c0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
f6d0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
f6e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
f6f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f700: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f710: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
f720: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f730: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f740: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f750: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
f760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f770: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
f780: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f790: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f7a0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
f7b0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
f7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f7d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
f7e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
f7f0: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
f800: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f810: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
f820: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
f830: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
f840: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
f850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
f860: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
f870: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f880: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
f890: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
f8a0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
f8b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f8c0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
f8d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f8e0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f8f0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f900: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
f910: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
f920: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
f930: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
f940: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
f950: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
f960: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
f970: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f980: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
f990: 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
f9a0: 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
f9b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f9c0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
f9d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
f9e0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
f9f0: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
fa00: 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
fa10: 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
fa20: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
fa30: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
fa40: 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
fa50: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fa60: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
fa70: 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
fa80: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
fa90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
faa0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fab0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fac0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fad0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fae0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
faf0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fb00: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fb10: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fb20: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fb30: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fb40: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fb50: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fb60: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
fb70: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fb80: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fb90: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fba0: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fbb0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
fbc0: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
fbd0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
fbe0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
fbf0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
fc00: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
fc10: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
fc20: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
fc30: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
fc40: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
fc50: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
fc60: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
fc70: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
fc80: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fc90: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
fca0: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fcb0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
fcc0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
fcd0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
fce0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
fcf0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
fd00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
fd10: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
fd20: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
fd30: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
fd40: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
fd50: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
fd60: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
fd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
fd80: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
fd90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fda0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
fdb0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
fdc0: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
fdd0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
fde0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
fdf0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
fe00: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
fe10: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
fe20: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
fe30: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
fe40: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
fe50: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
fe60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fe70: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
fe80: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
fe90: 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
fea0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
feb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fec0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
fed0: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
fee0: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
fef0: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ff00: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
ff10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
ff20: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
ff30: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
ff40: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
ff50: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
ff60: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
ff70: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
ff80: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
ff90: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
ffa0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
ffb0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
ffc0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
ffd0: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
ffe0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
fff0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10000 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10010 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10020 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10030 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10040 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10050 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
10060 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10070 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10080 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
10090 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
100a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
100b0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
100c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
100d0 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
100e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
100f0 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10100 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10110 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10120 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10130 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10140 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10150 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
10160 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
10170 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
10180 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
10190 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
101a0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
101b0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
101c0 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
101d0 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
101e0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
101f0 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10200 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10210 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10220 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10230 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10240 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10250 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
10260 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
10270 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
10290 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
102a0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
102b0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
102c0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
102d0 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
102e0 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
102f0 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10300 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10310 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10320 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10330 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10340 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10350 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
10360 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
10370 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
10380 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
10390 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
103a0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
103b0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
103c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
103d0 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
103e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
103f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10400 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10410 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10440 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10450 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
10460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10470 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
10480 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
10490 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
104b0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
104c0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
104d0 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
104e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
104f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10500 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10510 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10520 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
10550 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
10560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10570 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
10580 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
10590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
105a0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
105b0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
105c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
105d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
105e0 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
105f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10600 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10610 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10630 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10640 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10650 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
10660 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
10670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10680 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10690 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
106a0 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
106b0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
106c0 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
106d0 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
106e0 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
106f0 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10700 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10710 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10720 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
10730 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
10740 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
10750 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
10760 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
10770 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
10780 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10790 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
107a0 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
107b0 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
107c0 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
107d0 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
107e0 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
107f0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10800 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10810 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10830 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
10840 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
10850 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10870 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
10880 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10890 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
108a0 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
108b0 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
108c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
108d0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
108e0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
108f0 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10900 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10910 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10920 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
10930 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
10940 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
10950 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
10960 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10970 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10980 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10990 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
109a0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
109b0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
109c0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
109d0 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
109e0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
109f0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a00 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a10 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10a20 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10a30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10a40 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10a50 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10a60 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10a70 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10a90 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10ab0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10ac0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10ad0 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10ae0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10af0 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10b00 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10b10 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10b20 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10b30 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10b40 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10b50 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10b60 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10b70 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10b80 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10b90 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10ba0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10bb0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10bc0 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10bd0 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10be0 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10bf0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10c00 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10c10 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10c20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10c30 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10c40 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10c50 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10c60 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10c70 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10c80 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10c90 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10ca0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10cb0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
10cc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10cd0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
10ce0 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
10cf0 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
10d00 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
10d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10d20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
10d30 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
10d40 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
10d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10d60 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
10d70 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
10d80 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
10d90 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
10da0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
10db0 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
10dc0 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
10dd0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
10de0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
10df0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
10e00 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
10e10 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
10e20 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
10e30 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
10e60 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
10e70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
10e80 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
10e90 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
10ea0 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
10eb0 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
10ec0 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
10ed0 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
10ee0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
10ef0 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
10f00 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
10f10 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
10f20 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
10f30 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
10f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
10f50 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
10f60 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
10f70 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
10f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
10f90 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
10fa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10fb0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
10fc0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
10fd0 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
10fe0 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
10ff0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11000 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11010 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11020 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11030 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11040 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11050 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11060 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11070 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11080 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11090 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
110a0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
110b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
110c0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
110d0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
110e0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
110f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11100 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11110 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11120 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11130 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11140 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11150 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11160 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11180 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11190 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
111a0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
111b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
111c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
111d0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
111e0 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
111f0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11200 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11210 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11220 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11230 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11240 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
11250 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
11260 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
11270 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11280 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
11290 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
112a0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
112b0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
112c0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
112d0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
112e0 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
112f0 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11300 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11310 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11320 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
11330 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
11340 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
11350 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
11360 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
11370 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
11380 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
113b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
113c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
113d0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
113e0 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
113f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11400 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11410 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11420 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
11430 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
11440 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
11450 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
11460 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
11470 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
11480 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
11490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
114a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
114b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
114c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
114d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
114e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
114f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11500 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11510 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11520 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11530 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
11540 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
11550 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
11560 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
11570 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
11580 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
11590 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
115a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
115b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
115c0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
115d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
115e0 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
115f0 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11600 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11610 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11620 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
11630 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
11640 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11650 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
11660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
11670 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
11680 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
11690 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
116a0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
116b0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
116c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
116d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
116e0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
116f0 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11700 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11710 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11720 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
11730 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
11740 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
11750 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
11760 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
11770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
11780 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11790 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
117a0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
117b0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
117c0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
117d0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
117e0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
117f0 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11800 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11810 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11830 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
11840 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
11850 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11860 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
11870 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
11880 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11890 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
118a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
118b0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
118c0 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
118d0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
118e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
118f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11900 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11910 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11920 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
11930 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
11940 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
11950 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
11960 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
11970 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
11980 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11990 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
119a0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
119b0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
119c0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
119d0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
119e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11a10 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11a20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11a30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11a40 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11a50 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11a60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11a70 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11a80 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11a90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11aa0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11ab0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11ac0 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11ad0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11ae0 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11af0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11b00 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11b10 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11b30 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11b40 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11b50 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11b60 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11b70 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11b80 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11b90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11ba0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11bb0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11bc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11bd0 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11bf0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11c00 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11c10 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11c20 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c30 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11c40 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11c50 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11c60 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11c70 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11c80 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11c90 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11ca0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11cb0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
11cc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
11cd0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
11ce0 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
11cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
11d00 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
11d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11d20 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
11d30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11d40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11d50 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11d60 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
11d70 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
11d80 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
11d90 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
11da0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
11db0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
11dc0 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
11dd0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
11de0 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
11df0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
11e00 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
11e10 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
11e20 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
11e30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
11e40 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
11e50 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
11e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11e70 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
11e80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11e90 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
11ea0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
11eb0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11ec0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11ed0 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11ee0 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11ef0 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11f00 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11f10 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11f20 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11f30 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11f40 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11f50 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
11f60 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
11f70 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
11f80 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
11f90 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
11fa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11fb0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
11fc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
11fd0 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
11fe0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
11ff0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12000 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12010 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12020 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12030 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12040 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12050 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12060 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12070 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12080 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12090 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
120a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
120b0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
120c0 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
120d0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
120e0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
120f0 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12100 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12110 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12120 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12130 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12140 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12150 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12160 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12170 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12180 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12190 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
121a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
121b0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
121c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
121d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
121e0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
121f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12210 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12220 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12250 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
12260 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
12270 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
12280 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
12290 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
122a0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
122b0 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
122c0 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
122d0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
122e0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
122f0 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12300 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12310 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12320 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
12330 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
12340 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
12350 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12360 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
12370 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12380 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12390 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
123a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
123b0 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
123c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
123d0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
123e0 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
123f0 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12400 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12410 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12420 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
12430 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
12440 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
12450 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
12460 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
12470 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
12480 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
12490 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
124a0 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
124b0 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .errCode..**.** 
124c0 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
124d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
124e0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
124f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12500 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12510 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12520 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12530 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12540 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12550 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12560 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
12570 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12580 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
12590 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
125a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
125b0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
125c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
125d0 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
125e0 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
125f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12610 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12620 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12630 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12640 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12650 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12660 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
12670 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
12680 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
12690 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
126a0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
126b0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
126c0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
126d0 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
126e0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
126f0 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12700 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12710 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12720 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12730 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12740 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12750 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12760 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12770 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12780 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12790 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
127a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
127b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
127c0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
127d0 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
127e0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
127f0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
12800 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
12810 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
12820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
12830 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
12840 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
12850 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
12860 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12870 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
12880 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
12890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
128a0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
128b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
128c0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
128d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
128e0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
128f0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
12900 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
12910 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
12920 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
12930 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
12940 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
12950 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
12960 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
12970 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
12980 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
12990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
129a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
129b0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
129c0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
129d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
129e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
129f0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
12a00 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
12a10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
12a20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
12a30 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
12a40 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
12a50 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
12a60 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
12a70 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
12a80 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
12a90 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
12aa0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
12ab0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
12ac0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
12ad0 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
12ae0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
12af0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
12b00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12b10 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
12b20 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
12b30 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
12b40 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
12b50 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
12b60 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
12b70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
12b80 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12b90 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
12ba0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
12bb0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
12bc0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
12bd0 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
12be0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
12bf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
12c00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
12c10 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
12c20 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
12c30 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
12c40 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
12c50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12c60 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
12c70 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
12c80 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
12c90 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
12ca0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
12cb0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
12cc0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
12cd0 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
12ce0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
12cf0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
12d00 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
12d10 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
12d20 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
12d30 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12d40 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12d50 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
12d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12d70 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
12d80 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
12d90 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
12da0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
12db0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12dc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12dd0 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
12de0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
12df0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
12e00 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
12e10 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
12e20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
12e30 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
12e40 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
12e50 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
12e60 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
12e70 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
12e80 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
12e90 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
12ea0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
12eb0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
12ec0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12ed0 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
12ee0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
12ef0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
12f00 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
12f10 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
12f20 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
12f30 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
12f40 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
12f50 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
12f60 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
12f70 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
12f80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
12f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12fa0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
12fb0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
12fc0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
12fd0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
12fe0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
12ff0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
13000 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
13010 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13020 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
13030 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
13040 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
13050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13060 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13070 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
13080 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
13090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
130a0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
130b0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
130c0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
130d0 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
130e0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
130f0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
13100 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
13110 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
13120 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
13130 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13140 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
13150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
13160 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
13170 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
13180 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
13190 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
131a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
131b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
131c0 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
131d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
131e0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
131f0 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13200 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13210 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13220 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13230 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13240 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13250 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
13260 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
13270 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
13280 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
13290 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
132a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
132b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
132c0 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
132d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
132e0 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
132f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13300 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13310 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13320 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13330 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13340 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13360 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13370 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13380 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13390 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
133a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
133b0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
133c0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
133d0 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
133e0 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
133f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13400 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13410 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13420 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13430 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13440 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13450 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13460 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13470 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13480 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13490 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
134a0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
134b0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
134c0 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
134d0 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
134e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
134f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13500 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13520 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13530 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13540 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13550 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13560 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13570 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13590 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
135a0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
135b0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
135c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
135d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
135e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
135f0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13600 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13620 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13630 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13640 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13650 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13660 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13670 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13680 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
136a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
136b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
136c0 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
136d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
136e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
136f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13700 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13710 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13720 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13730 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13740 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13760 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13770 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13780 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13790 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
137a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
137b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
137d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
137e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
137f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
13800 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
13810 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13820 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
13830 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
13840 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13850 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
13860 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
13870 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
13880 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
13890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
138a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
138b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
138c0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
138d0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
138e0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
138f0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
13900 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
13910 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
13920 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
13930 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
13940 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
13950 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
13960 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
13970 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
13980 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
13990 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
139a0 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
139b0 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
139c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
139d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
139e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
139f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13a00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
13a10 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
13a20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13a30 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13a40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13a50 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
13a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13a70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13a80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
13a90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13aa0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13ab0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
13ac0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13ad0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
13ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13af0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
13b00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
13b10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
13b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
13b30 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13b40 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50  PAGES.  sqlite3P
13b50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
13b60 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
13b70 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
13b80 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50  ehash);.  if( pP
13b90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
13ba0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
13bb0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
13bc0 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
13bd0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61     PgHdr *p = pa
13be0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
13bf0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
13c00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
13c10 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
13c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
13c30 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ef(p);.    }.  }
13c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
13c50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
13c60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13c70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
13c80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
13c90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
13ca0 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
13cb0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
13cc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
13cd0 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
13ce0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
13cf0 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
13d00 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  Size);..  if( pa
13d10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13d20 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
13d30 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
13d40 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
13d50 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
13d60 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
13d70 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
13d80 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
13d90 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
13da0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
13db0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
13dc0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
13dd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13de0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
13df0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
13e00 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
13e10 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
13e20 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
13e30 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
13e40 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
13e50 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
13e60 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
13e70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
13e80 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
13e90 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
13ea0 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
13eb0 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
13ec0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
13ed0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13ee0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
13ef0 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
13f00 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
13f10 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
13f20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
13f30 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
13f40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
13f50 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
13f60 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
13f70 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
13f80 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
13f90 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
13fa0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13fb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
13fc0 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
13fd0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
13fe0 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
13ff0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
14000 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
14010 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
14020 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14030 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
14040 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14050 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
14060 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
14070 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
14080 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
14090 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
140a0 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
140b0 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
140c0 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
140d0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
140e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
140f0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
14100 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
14110 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
14120 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
14130 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
14140 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
14150 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
14160 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
14170 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14180 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
14190 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
141a0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
141b0 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
141c0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
141d0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
141e0 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
141f0 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
14200 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
14210 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
14220 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
14230 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
14240 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
14250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
14260 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
14270 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
14280 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
14290 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
142a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
142b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
142c0 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
142d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
142e0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
142f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
14300 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
14310 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
14320 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
14330 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14340 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
14350 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14360 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
14370 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
14380 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14390 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
143a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
143b0 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
143c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
143d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
143e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
143f0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
14400 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
14410 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
14420 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
14430 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
14440 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
14450 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
14460 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
14470 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
14480 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
14490 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
144a0 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
144b0 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
144c0 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
144d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
144e0 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
144f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
14500 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
14510 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
14520 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
14530 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
14540 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
14550 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
14560 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
14570 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
14580 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
14590 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
145a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
145b0 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
145c0 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
145d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
145e0 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
145f0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
14600 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
14610 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14620 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
14630 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
14640 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
14650 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
14660 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
14670 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
14680 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
14690 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
146a0 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
146b0 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
146c0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
146d0 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
146e0 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
146f0 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
14700 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
14710 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
14720 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
14730 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
14740 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
14750 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
14760 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
14770 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
14780 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
14790 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
147a0 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
147b0 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
147c0 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
147d0 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
147e0 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
147f0 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
14800 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
14810 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
14820 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
14830 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
14840 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
14850 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
14860 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
14870 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
14880 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
14890 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
148a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
148b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
148c0 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
148d0 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
148e0 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
148f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
14900 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
14910 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
14920 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
14930 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
14940 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
14950 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
14960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
14970 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
14980 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
14990 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
149a0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
149b0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
149c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
149d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
149e0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
149f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
14a20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
14a30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
14a40 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
14a50 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
14a60 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
14a70 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
14a80 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
14a90 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
14aa0 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
14ab0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
14ac0 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
14ad0 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
14ae0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
14af0 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
14b00 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
14b10 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
14b20 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
14b30 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
14b40 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
14b50 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
14b60 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
14b70 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
14b80 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
14b90 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
14ba0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
14bb0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
14bc0 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
14bd0 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
14be0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
14bf0 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
14c00 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
14c10 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
14c20 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
14c30 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
14c40 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
14c50 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
14c60 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
14c70 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
14c80 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
14c90 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
14ca0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
14cc0 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
14cd0 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
14ce0 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
14cf0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
14d00 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
14d10 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
14d20 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
14d30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
14d40 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
14d50 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
14d60 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
14d70 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
14d80 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
14d90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
14da0 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
14db0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
14dc0 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
14dd0 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
14de0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
14df0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
14e00 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
14e10 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14e20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14e30 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
14e40 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
14e50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14e60 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
14e70 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
14e80 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
14e90 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
14ea0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14eb0 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
14ec0 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
14ed0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
14ee0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
14ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
14f00 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
14f10 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14f20 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14f30 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
14f40 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
14f50 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
14f60 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
14f70 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
14f80 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
14f90 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
14fa0 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
14fb0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
14fc0 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
14fd0 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
14fe0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
14ff0 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
15000 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
15010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
15020 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
15030 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
15040 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
15050 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
15060 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
15070 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
15080 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
15090 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
150a0 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
150b0 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
150c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
150d0 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
150e0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
150f0 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
15100 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
15110 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
15120 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15130 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
15140 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
15150 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
15160 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
15170 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
15180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15190 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
151a0 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
151b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
151c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
151d0 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
151e0 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
151f0 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
15200 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
15210 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
15220 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
15230 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
15240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15250 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
15260 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
15270 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
15280 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
15290 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
152a0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
152b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
152c0 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
152f0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
15310 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
15340 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
15350 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
15360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15370 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15380 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
15390 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
153a0 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
153d0 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
153e0 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
153f0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
15400 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
15410 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
15420 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
15430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
15440 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15450 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
15460 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
15470 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
15480 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
154b0 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
154c0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
154d0 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
154e0 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
154f0 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
15500 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
15510 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
15520 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
15530 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
15540 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
15550 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
15560 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
15570 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
15580 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
15590 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
155a0 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
155b0 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
155c0 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
155d0 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
155e0 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
155f0 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
15600 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
15610 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
15620 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
15630 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
15640 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
15650 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
15660 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
15670 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
15680 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
15690 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
156a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
156b0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
156c0 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
156d0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
156e0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
156f0 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
15700 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
15710 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
15720 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
15730 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
15740 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
15750 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
15760 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
15770 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
15780 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
15790 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
157a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
157b0 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
157c0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
157d0 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
157e0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
157f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15800 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15810 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15820 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
15830 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15840 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
15850 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
15860 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
15870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15880 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15890 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
158a0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
158b0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
158c0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
158d0 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
158e0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
158f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
15900 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
15910 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
15920 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
15930 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
15940 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
15950 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
15960 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
15970 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
15980 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
15990 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
159a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
159b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
159c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
159d0 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
159e0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
159f0 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
15a00 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
15a10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15a20 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
15a30 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
15a40 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
15a50 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
15a60 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
15a70 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
15a80 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
15a90 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
15aa0 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
15ab0 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
15ac0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
15ad0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
15ae0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
15af0 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
15b00 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
15b10 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
15b20 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
15b30 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
15b40 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
15b50 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
15b60 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
15b70 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
15b80 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
15b90 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
15ba0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
15bb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
15bc0 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
15bd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15be0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
15bf0 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
15c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
15c10 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
15c20 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
15c30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15c40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15c50 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
15c60 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
15c70 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
15c80 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
15c90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
15ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
15cb0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
15cc0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
15cd0 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
15ce0 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
15cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15d00 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
15d10 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
15d20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15d30 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f  n played by befo
15d40 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
15d50 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
15d60 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
15d70 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
15d80 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
15d90 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
15da0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
15db0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
15dc0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
15dd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
15de0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
15df0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
15e00 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
15e10 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
15e20 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
15e30 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
15e40 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
15e50 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
15e60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
15e70 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
15e80 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
15e90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
15ea0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
15eb0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
15ec0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
15ed0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
15ee0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
15ef0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
15f00 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
15f10 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
15f20 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
15f30 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
15f40 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
15f50 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
15f60 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
15f70 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
15f80 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
15f90 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
15fa0 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
15fb0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
15fc0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
15fd0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
15fe0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
15ff0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
16000 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
16010 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
16020 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
16030 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
16040 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
16050 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
16060 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
16070 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
16080 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
16090 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
160a0 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
160b0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
160c0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
160d0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
160e0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
160f0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
16100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
16110 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
16120 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
16130 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
16140 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
16150 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
16160 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
16170 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
16180 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
16190 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
161a0 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
161b0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
161c0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
161d0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
161e0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
161f0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
16200 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
16210 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
16220 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
16230 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
16240 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
16250 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
16260 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
16270 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16280 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
16290 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
162a0 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
162b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
162c0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
162d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
162e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
162f0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
16300 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
16310 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
16320 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
16330 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
16340 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
16350 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
16360 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
16370 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
16380 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
16390 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
163a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
163b0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
163c0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
163d0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
163e0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
163f0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
16400 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
16410 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
16420 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
16430 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
16440 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
16450 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
16460 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
16470 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
16480 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
16490 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
164a0 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
164b0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
164c0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
164d0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
164e0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
164f0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
16500 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
16510 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
16520 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
16530 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
16540 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
16550 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
16560 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
16570 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
16580 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
16590 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
165a0 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
165b0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
165c0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
165d0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
165e0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
165f0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
16600 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
16610 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
16620 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
16630 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
16640 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
16650 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
16660 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
16670 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
16680 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
16690 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
166a0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
166b0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
166c0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
166d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
166e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
166f0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
16700 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
16710 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
16720 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
16730 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
16740 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16750 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
16760 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
16770 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg==0 );.  PAGER
16780 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
16790 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
167a0 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
167b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
167c0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
167d0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
167e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
167f0 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
16800 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
16810 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
16820 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
16830 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
16840 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
16850 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
16860 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
16870 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
16880 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
16890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
168a0 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
168b0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
168c0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
168d0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
168e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
168f0 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
16900 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16910 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
16920 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
16930 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
16940 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
16950 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
16960 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
16970 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
16980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
16990 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
169a0 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
169b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
169c0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
169d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
169e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
169f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
16a00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
16a10 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
16a20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
16a30 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
16a40 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
16a50 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
16a60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
16a70 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
16a80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16a90 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
16aa0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16ab0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
16ac0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
16ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
16ae0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
16af0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
16b00 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
16b10 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
16b20 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
16b30 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
16b40 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
16b50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16b60 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
16b70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
16b80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
16b90 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
16ba0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
16bb0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
16bc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
16bd0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
16be0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
16bf0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
16c00 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
16c10 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
16c20 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
16c30 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
16c40 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
16c50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
16c60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
16c70 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
16c80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
16c90 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
16ca0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
16cb0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
16cc0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
16cd0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
16ce0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
16cf0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
16d00 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
16d10 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
16d20 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
16d30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
16d40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
16d50 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
16d60 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
16d70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
16d80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
16d90 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
16da0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
16db0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16dc0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
16dd0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
16de0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
16df0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
16e00 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
16e10 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
16e20 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
16e30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
16e40 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
16e50 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
16e60 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
16e70 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
16e80 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
16e90 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
16ea0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
16eb0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
16ec0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
16ed0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
16ee0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
16ef0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
16f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16f10 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
16f20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
16f30 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
16f40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16f50 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
16f60 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
16f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16f80 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
16f90 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
16fa0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
16fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16fc0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16fd0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
16fe0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
16ff0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17000 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17010 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17020 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17030 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17040 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17050 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17060 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17070 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17080 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17090 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
170a0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
170b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
170c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
170d0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
170e0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
170f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17100 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17110 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17120 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17130 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17140 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17150 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17160 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17170 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17180 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17190 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
171a0 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
171b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
171c0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
171d0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
171e0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
171f0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17200 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17210 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17220 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17230 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17240 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17250 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17260 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17270 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17280 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17290 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
172a0 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
172b0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
172d0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
172e0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
172f0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17300 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17310 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17320 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17330 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17340 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17350 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17360 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17370 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17380 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17390 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
173a0 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
173b0 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
173c0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
173d0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
173e0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
173f0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17400 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17410 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17420 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
17430 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
17440 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
17450 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
17460 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
17470 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
17480 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
17490 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
174a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
174b0 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
174c0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
174d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
174e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
174f0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
17500 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
17510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17520 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17530 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
17540 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
17550 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
17560 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17570 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
17580 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
17590 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
175a0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
175b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
175c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
175d0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
175e0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
175f0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
17600 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
17610 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
17620 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
17630 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
17640 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
17650 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
17660 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
17670 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
17680 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
17690 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
176a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
176b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
176c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
176d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
176e0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
176f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17700 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
17710 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
17720 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
17730 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
17740 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
17750 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
17760 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
17770 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
17780 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
17790 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
177a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
177b0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
177c0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
177d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
177e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
177f0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
17800 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
17810 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
17820 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
17830 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17840 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17850 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
17860 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
17870 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
17880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17890 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
178a0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
178b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
178c0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
178d0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
178e0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
178f0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
17900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
17910 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
17920 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
17930 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
17940 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
17950 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
17960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17970 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
17980 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
17990 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
179a0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
179b0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
179c0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
179d0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
179e0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
179f0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
17a00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
17a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17a20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
17a30 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
17a40 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
17a50 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
17a60 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
17a70 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
17a80 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
17a90 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
17aa0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
17ab0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
17ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17ad0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
17ae0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
17af0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
17b00 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
17b10 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
17b30 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
17b40 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
17b50 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
17b60 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
17b70 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
17b80 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
17b90 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
17ba0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
17bb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17bc0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
17bd0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
17be0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
17bf0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
17c00 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
17c10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
17c20 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
17c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
17c40 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
17c50 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
17c60 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
17c70 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
17c80 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17c90 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
17ca0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
17cb0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
17cc0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
17ce0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
17cf0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
17d00 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
17d10 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
17d20 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
17d30 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
17d40 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
17d50 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
17d60 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
17d70 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
17d80 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
17d90 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
17da0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17db0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
17dc0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
17dd0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
17de0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
17df0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
17e00 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
17e10 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
17e20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
17e30 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
17e40 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
17e50 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
17e60 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17e70 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
17e90 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
17ea0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
17eb0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
17ec0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
17ed0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
17ee0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17ef0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
17f00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
17f10 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
17f20 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
17f30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17f40 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
17f50 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
17f60 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
17f70 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
17f80 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
17f90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
17fa0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
17fb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
17fc0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
17fd0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
17fe0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
17ff0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18000 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18010 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18020 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18030 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18040 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18050 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18060 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18070 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18080 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
180a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
180b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
180c0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
180d0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
180e0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
180f0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18100 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18110 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18120 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18140 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18150 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18160 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18170 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18180 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18190 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
181a0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
181b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
181c0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
181d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
181e0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
181f0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18200 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18210 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18220 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18230 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18240 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18260 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18270 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18280 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18290 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
182a0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
182b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
182c0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
182d0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
182e0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
182f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18300 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18310 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18320 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18330 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18340 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18350 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18360 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18370 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18380 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18390 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
183a0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
183b0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
183c0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
183d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
183e0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
183f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18400 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18410 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18420 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
18430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18440 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
18450 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
18460 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
18470 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18480 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18490 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
184a0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
184b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
184c0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
184d0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
184e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
184f0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
18500 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
18510 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
18520 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
18530 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
18540 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
18550 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
18560 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
18570 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
18580 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
18590 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
185a0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
185b0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
185c0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
185d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
185e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
185f0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18600 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
18610 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
18620 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
18630 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
18640 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
18650 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
18660 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
18670 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
18680 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
18690 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
186a0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
186b0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
186c0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
186d0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
186e0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
186f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18700 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
18710 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
18720 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
18730 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18740 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18750 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
18760 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18770 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
18780 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
18790 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
187a0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
187b0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
187c0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
187d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
187e0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
187f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
18800 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
18810 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
18820 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
18830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18850 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18870 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
18880 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
18890 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
188a0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
188b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
188c0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
188d0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
188e0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
188f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
18900 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
18910 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
18920 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
18930 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
18940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18950 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
18960 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18970 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18980 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
18990 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
189a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
189b0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
189c0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
189d0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
189e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
189f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18a00 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
18a20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
18a30 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
18a40 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
18a50 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
18a60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
18a70 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
18a80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18a90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18aa0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ab0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
18ac0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
18ad0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
18ae0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
18af0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
18b00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
18b10 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
18b20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
18b30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18b40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
18b50 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18b60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18b70 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
18b80 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
18b90 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
18ba0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
18bb0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
18bc0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
18bd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
18be0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
18bf0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
18c00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
18c10 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
18c20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
18c30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
18c40 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
18c50 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
18c60 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
18c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
18c80 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
18c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18ca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18cb0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
18cc0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
18cd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
18ce0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
18cf0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
18d00 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
18d10 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
18d20 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
18d30 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
18d40 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
18d50 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
18d60 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
18d70 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
18d80 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
18d90 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
18da0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
18db0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
18dc0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
18dd0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
18de0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
18df0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
18e00 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
18e10 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
18e20 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
18e30 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
18e40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
18e50 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
18e60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
18e70 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
18e80 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
18e90 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
18ea0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
18eb0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
18ec0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
18ed0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
18ee0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
18ef0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
18f00 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
18f10 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
18f20 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
18f30 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
18f40 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
18f50 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
18f60 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
18f70 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
18f80 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
18f90 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
18fa0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
18fb0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
18fc0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
18fd0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
18fe0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
18ff0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
19000 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
19010 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
19020 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19030 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19040 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19050 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19070 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19080 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19090 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
190a0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
190b0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
190c0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
190d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
190e0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
190f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19100 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
19110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19120 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
19130 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19140 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19150 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
19160 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
19170 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
19180 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
19190 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
191a0 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
191b0 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
191c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
191d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
191e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
191f0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
19200 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
19210 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
19220 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
19230 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19240 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
19250 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
19260 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
19270 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
19280 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
19290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
192a0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
192b0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
192c0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
192d0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
192e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
192f0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19300 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19330 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19340 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
19350 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
19360 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19380 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
19390 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
193a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
193b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
193c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
193d0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
193e0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
193f0 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
19400 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
19410 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
19420 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
19430 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
19440 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
19450 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
19460 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
19470 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
19480 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
19490 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
194a0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
194b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
194c0 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
194d0 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
194e0 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
194f0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
19500 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
19510 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
19520 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
19530 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
19540 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
19550 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
19560 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
19570 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19580 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
19590 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
195a0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
195b0 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
195c0 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
195d0 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
195e0 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
195f0 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
19600 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
19610 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
19620 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
19630 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  IZE..*/.static v
19640 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
19650 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
19660 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
19670 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
19680 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
19690 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  le );..  if( !pP
196a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
196b0 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
196c0 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
196d0 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
196e0 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
196f0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
19700 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
19710 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
19720 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
19730 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
19740 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
19750 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a  egfault..    */.
19760 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19770 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
19780 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
19790 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20  ger->fd);.  }.  
197a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
197b0 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20  orSize<32 ){.   
197c0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
197d0 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20  ize = 512;.  }. 
197e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
197f0 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
19800 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
19810 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
19820 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
19830 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
19840 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54  rSize = MAX_SECT
19850 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a  OR_SIZE;.  }.}..
19860 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
19870 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
19880 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
19890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
198a0 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
198b0 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
198c0 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
198d0 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
198e0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
198f0 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
19900 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
19910 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
19920 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
19930 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
19940 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
19950 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19960 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19970 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
19980 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
19990 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
199a0 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
199b0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
199c0 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
199d0 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
199e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
199f0 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
19a00 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
19a10 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
19a20 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19a30 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
19a40 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
19a50 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
19a60 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
19a70 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
19a80 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19a90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
19aa0 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
19ab0 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
19ac0 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
19ad0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
19ae0 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
19af0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19b00 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
19b10 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
19b20 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
19b30 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
19b40 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
19b50 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
19b60 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
19b70 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69  h is the page si
19b80 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72  ze..**  (7)  zer
19b90 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f  o padding out to
19ba0 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
19bb0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20   size..**  (8)  
19bc0 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
19bd0 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
19be0 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
19bf0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19c00 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
19c10 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
19c20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
19c30 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
19c40 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
19c50 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
19c60 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
19c70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
19c80 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
19c90 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61   first 7 items a
19ca0 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
19cb0 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
19cc0 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
19cd0 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65  e of the 8th ite
19ce0 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
19cf0 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
19d00 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
19d10 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
19d20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
19d30 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
19d40 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
19d50 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
19d60 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
19d70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
19d80 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
19d90 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
19da0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
19db0 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
19dc0 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
19dd0 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
19de0 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
19df0 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
19e00 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
19e10 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
19e20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
19e30 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
19e40 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
19e50 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
19e60 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
19e70 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
19e80 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
19e90 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
19ea0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
19eb0 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
19ec0 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
19ed0 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
19ee0 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
19ef0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
19f00 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
19f10 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
19f20 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
19f30 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
19f40 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
19f50 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
19f60 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
19f70 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
19f80 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
19f90 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
19fa0 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
19fb0 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
19fc0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
19fd0 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
19fe0 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
19ff0 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
1a000 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
1a010 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
1a020 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1a030 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
1a040 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
1a050 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
1a060 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
1a070 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
1a080 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
1a090 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
1a0a0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
1a0b0 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
1a0c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1a0d0 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
1a0e0 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
1a0f0 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
1a100 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
1a110 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
1a120 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1a130 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
1a140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1a150 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
1a160 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1a170 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
1a180 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
1a190 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
1a1a0 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
1a1b0 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
1a1c0 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1a1d0 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
1a1e0 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
1a1f0 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
1a200 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a210 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
1a220 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
1a230 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
1a240 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
1a250 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
1a260 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
1a270 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
1a280 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
1a290 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
1a2a0 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
1a2b0 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
1a2c0 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
1a2d0 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
1a2e0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
1a2f0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1a300 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
1a310 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
1a320 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
1a330 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
1a340 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
1a350 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
1a360 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
1a370 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
1a380 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
1a390 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
1a3a0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1a3b0 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
1a3c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1a3d0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1a3e0 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a400 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
1a410 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
1a420 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
1a430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a440 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
1a450 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
1a460 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1a490 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1a4a0 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
1a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a4c0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1a4d0 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
1a4e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a500 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
1a510 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
1a520 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
1a530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a540 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a550 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1a560 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
1a570 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
1a580 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
1a590 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1a5a0 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
1a5b0 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
1a5c0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
1a5d0 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
1a5e0 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
1a5f0 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20  llback */..  /* 
1a600 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1a610 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1a620 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1a630 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1a640 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1a650 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1a660 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1a670 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1a680 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a690 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1a6a0 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1a6b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a6c0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1a6d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1a6e0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1a6f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1a700 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1a710 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1a720 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1a730 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a740 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1a750 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1a760 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1a770 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1a780 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1a790 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1a7a0 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1a7b0 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1a7c0 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1a7d0 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1a7e0 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1a7f0 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1a800 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1a810 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1a820 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1a830 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1a840 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1a850 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1a860 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1a870 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1a880 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1a890 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1a8a0 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50  nix.c,.  **  mxP
1a8b0 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
1a8c0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
1a8d0 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
1a8e0 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
1a8f0 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
1a900 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
1a910 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1a920 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
1a930 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1a940 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1a950 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1a960 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1a970 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
1a980 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1a990 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
1a9a0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1a9b0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
1a9c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1a9d0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
1a9e0 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
1a9f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1aa00 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
1aa10 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1aa20 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
1aa30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1aa40 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
1aa50 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
1aa60 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
1aa70 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
1aa80 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
1aa90 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
1aaa0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
1aab0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
1aac0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1aad0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
1aae0 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
1aaf0 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
1ab00 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61   1 ){.    /* Rea
1ab10 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
1ab20 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
1ab30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1ab40 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
1ab50 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
1ab60 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
1ab70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ab80 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
1ab90 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
1aba0 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
1abb0 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
1abc0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1abd0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
1abe0 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
1abf0 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
1ac00 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
1ac10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
1ac20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1ac30 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
1ac40 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a  Pager, isHot, sz
1ac50 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
1ac60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ac70 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
1ac80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ac90 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1aca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1acb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1acc0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1acd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ace0 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
1acf0 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
1ad00 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
1ad10 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1ad20 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
1ad30 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1ad40 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1ad50 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
1ad60 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
1ad70 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
1ad80 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
1ad90 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
1ada0 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
1adb0 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
1adc0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
1add0 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
1ade0 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
1adf0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
1ae00 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
1ae10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ae20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1ae30 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1ae40 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
1ae50 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1ae60 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1ae70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
1ae80 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1ae90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1aea0 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
1aeb0 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
1aec0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1aed0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1aee0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1aef0 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
1af00 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
1af10 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
1af20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
1af30 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
1af40 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
1af50 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
1af60 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
1af70 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
1af80 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
1af90 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
1afa0 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
1afb0 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
1afc0 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
1afd0 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
1afe0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
1aff0 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
1b000 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
1b010 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
1b020 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e  565..    ** When
1b030 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1b040 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65  hot journal, nRe
1b050 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e  c==0 always mean
1b060 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a  s that the next.
1b070 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20      ** chunk of 
1b080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
1b090 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20  ains zero pages 
1b0a0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b0b0 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77  k.  But.    ** w
1b0c0 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c  hen doing a ROLL
1b0d0 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65  BACK and the nRe
1b0e0 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68  c==0 chunk is th
1b0f0 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a  e last chunk in.
1b100 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
1b110 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  al, it means tha
1b120 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  t the journal mi
1b130 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69  ght contain addi
1b140 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61  tional.    ** pa
1b150 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
1b160 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1b170 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d  and that the num
1b180 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
1b190 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63    ** should be c
1b1a0 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e  omputed based on
1b1b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b1c0 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
1b1d0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
1b1e0 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
1b1f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b200 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1b210 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1b220 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b230 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
1b240 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
1b250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b260 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
1b270 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1b280 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1b290 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1b2a0 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
1b2b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
1b2c0 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
1b2d0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1b2e0 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
1b2f0 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
1b300 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1b310 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b320 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b330 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
1b340 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
1b350 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
1b360 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b380 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b390 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
1b3a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1b3b0 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
1b3c0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
1b3d0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
1b3e0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b3f0 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
1b400 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
1b410 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
1b420 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
1b430 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
1b440 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
1b450 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
1b460 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
1b470 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1b480 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
1b490 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1b4a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1b4b0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1b4c0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
1b4d0 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  ager,&pPager->jo
1b4e0 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b  urnalOff,0,1,0);
1b4f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b510 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b520 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b540 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
1b550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b560 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1b570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b580 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1b590 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1b5a0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1b5b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1b5c0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1b5d0 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1b5e0 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1b5f0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1b600 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1b610 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1b620 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1b630 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1b640 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1b650 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1b660 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1b670 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1b680 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1b690 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1b6a0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1b6b0 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1b6c0 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1b6d0 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1b6e0 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1b6f0 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1b700 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1b710 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1b720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1b740 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1b750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b760 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1b770 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1b780 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1b790 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1b7a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1b7b0 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1b7c0 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1b7d0 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1b7e0 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1b7f0 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1b800 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1b810 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1b820 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1b830 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1b840 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1b850 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1b860 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1b870 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1b880 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1b890 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b8a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b8b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1b8c0 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1b8d0 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1b8e0 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1b8f0 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1b900 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1b910 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1b920 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1b930 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1b940 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1b950 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1b960 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1b970 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1b980 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1b990 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1b9a0 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1b9b0 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1b9c0 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1b9d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b9e0 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1b9f0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
1ba00 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64  (.    pPager->fd
1ba10 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c  ->pMethods==0 ||
1ba20 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1ba30 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
1ba40 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1ba50 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1ba60 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )>=SQLITE_OK.  )
1ba70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1ba80 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1ba90 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1baa0 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1bab0 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1bac0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1bad0 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1bae0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1baf0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1bb00 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1bb10 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1bb20 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1bb30 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1bb40 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1bb50 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1bb60 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1bb70 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1bb80 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1bb90 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1bba0 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1bbb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1bbc0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1bbd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1bbe0 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1bbf0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1bc00 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1bc10 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1bc20 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1bc30 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1bc40 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1bc50 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1bc60 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1bc70 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1bc80 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1bc90 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1bca0 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1bcb0 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1bcc0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1bcd0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1bce0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1bcf0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bd00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1bd10 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1bd20 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1bd30 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1bd40 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1bd50 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1bd60 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1bd70 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1bd80 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1bd90 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1bda0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bdb0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1bdc0 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
1bdd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1bde0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1bdf0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1be00 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a  AGER_OPEN).  ){.
1be10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1be20 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
1be30 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
1be40 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
1be50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1be60 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1be70 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1be80 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1be90 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
1bea0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1beb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1bec0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bed0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1bee0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1bef0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1bf00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bf10 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1bf20 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1bf30 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1bf40 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1bf50 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1bf60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1bf70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1bf80 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1bf90 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1bfa0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1bfb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bfc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1bfd0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1bfe0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1bff0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1c000 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1c010 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1c020 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1c030 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1c040 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1c050 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1c060 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1c070 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1c080 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1c090 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1c0a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1c0b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c0c0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1c0d0 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1c0e0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c0f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c100 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1c110 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1c120 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1c130 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1c140 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1c150 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1c160 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c170 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1c180 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1c190 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1c1a0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1c1b0 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1c1c0 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1c1d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c1e0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1c1f0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1c200 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c210 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1c220 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1c230 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1c240 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c250 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c260 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1c270 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
1c280 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c290 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
1c2a0 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
1c2b0 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
1c2c0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
1c2d0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
1c2e0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1c2f0 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
1c300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c310 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1c320 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c330 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30   int isInWal = 0
1c340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c350 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
1c360 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
1c370 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1c380 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1c390 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c3a0 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1c3b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c3c0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1c3d0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1c3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1c3f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1c400 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
1c410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c420 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
1c430 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1c440 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
1c450 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1c460 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c470 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1c480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c490 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1c4a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c4b0 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1c4c0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1c4d0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1c4e0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1c4f0 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61  lite3WalRead(pPa
1c500 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
1c510 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c   &isInWal, pgsz,
1c520 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1c530 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c540 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61  TE_OK && !isInWa
1c550 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  l ){.    i64 iOf
1c560 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1c570 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1c580 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1c590 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1c5a0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1c5b0 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1c5c0 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1c5d0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c5e0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c5f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c600 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1c610 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1c620 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1c630 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1c640 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1c650 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1c660 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1c670 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1c680 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1c690 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1c6a0 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1c6b0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1c6c0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1c6d0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1c6e0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1c6f0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1c700 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1c710 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1c720 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c730 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1c740 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1c750 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1c760 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1c770 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1c780 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1c790 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1c7a0 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1c7b0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1c7c0 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1c7d0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1c7e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1c7f0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1c800 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1c810 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1c820 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1c830 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1c840 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c850 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1c860 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1c870 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1c880 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
1c890 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1c8a0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1c8b0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1c8c0 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1c8d0 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1c8e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c8f0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1c900 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1c910 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1c920 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1c930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c940 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1c950 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1c960 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1c970 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1c980 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1c990 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1c9a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c9b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1c9c0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1c9d0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1c9e0 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1c9f0 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1ca00 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1ca10 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1ca20 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1ca30 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1ca40 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1ca50 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1ca60 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1ca70 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1ca80 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1ca90 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1caa0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cab0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1cac0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cad0 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1cae0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1caf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1cb00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1cb10 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
1cb20 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
1cb30 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1cb40 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
1cb50 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
1cb60 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
1cb70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1cb80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
1cb90 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
1cba0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1cbb0 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
1cbc0 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
1cbd0 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
1cbe0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1cbf0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1cc00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
1cc10 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
1cc20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
1cc30 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
1cc40 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
1cc50 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
1cc60 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
1cc70 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
1cc80 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
1cc90 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
1cca0 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
1ccb0 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
1ccc0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ccd0 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
1cce0 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
1ccf0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1cd00 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
1cd10 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
1cd20 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
1cd30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1cd40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1cd50 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
1cd60 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
1cd70 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
1cd80 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
1cd90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cda0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1cdb0 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1cdc0 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
1cdd0 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c  Pg;..  pPg = sql
1cde0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1cdf0 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1ce00 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1ce10 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1ce20 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1ce30 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1ce40 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1ce50 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1ce60 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1ce70 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
1ce80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ce90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cea0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1ceb0 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1cec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1ced0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1cee0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1cef0 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1cf00 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1cf10 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1cf20 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1cf30 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1cf40 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1cf50 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1cf60 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1cf70 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1cf80 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1cf90 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1cfa0 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1cfb0 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1cfc0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1cfd0 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1cfe0 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1cff0 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1d000 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1d010 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1d020 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1d030 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1d040 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1d050 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1d060 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1d070 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1d080 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1d090 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1d0a0 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1d0b0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1d0c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1d0d0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1d0e0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1d0f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d100 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d110 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1d120 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1d130 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1d140 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1d150 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1d160 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1d170 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1d180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1d1a0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1d1b0 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d1d0 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1d1e0 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1d1f0 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1d200 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1d210 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1d220 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1d230 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1d240 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1d250 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1d260 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1d270 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1d280 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1d290 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1d2a0 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1d2b0 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1d2c0 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1d2d0 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1d2e0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1d2f0 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1d300 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1d310 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1d320 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1d330 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1d340 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1d350 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1d360 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1d370 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1d380 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1d390 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1d3a0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1d3b0 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
1d3c0 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1d3d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1d3e0 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1d3f0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1d400 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1d410 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1d420 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1d430 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1d440 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1d450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d460 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d470 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1d480 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1d490 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1d4a0 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1d4b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1d4c0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1d4d0 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1d4e0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1d4f0 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1d500 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1d510 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1d520 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1d530 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1d540 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a  * changed. .*/ .
1d550 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d560 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1d570 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d590 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1d5a0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1d5d0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1d5e0 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1d610 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1d620 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1d630 6d 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20  mmit,           
1d640 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d650 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1d660 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  mit */.  int syn
1d670 63 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  cFlags          
1d680 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1d690 73 20 74 6f 20 70 61 73 73 20 74 6f 20 4f 73 53  s to pass to OsS
1d6a0 79 6e 63 28 29 20 28 6f 72 20 30 29 20 2a 2f 0a  ync() (or 0) */.
1d6b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1d6e0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
1d6f0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
1d700 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d710 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
1d720 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
1d730 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1d740 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
1d750 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e  e, isCommit, syn
1d760 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  cFlags.  );.  if
1d770 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d780 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
1d790 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  up ){.    PgHdr 
1d7a0 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  *p;.    for(p=pL
1d7b0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1d7c0 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1d7d0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1d7e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1d7f0 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1d800 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1d810 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1d820 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d830 20 20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70    {.    PgHdr *p
1d840 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1d850 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1d860 79 29 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  y) pager_set_pag
1d870 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1d880 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1d890 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1d8a0 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1d8b0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1d8c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1d8d0 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1d8e0 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1d8f0 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1d900 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1d910 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1d920 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1d930 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1d940 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1d950 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1d960 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1d970 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1d980 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1d990 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1d9a0 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1d9b0 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1d9c0 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1d9d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d9e0 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1d9f0 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1da00 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1da10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1da30 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1da40 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da60 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1da70 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1da80 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1da90 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1daa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1dab0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1dac0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1dad0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1dae0 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1daf0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1db00 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1db10 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1db20 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1db30 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1db40 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1db50 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1db60 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1db70 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1db80 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1db90 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1dba0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1dbb0 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1dbc0 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1dbd0 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1dbe0 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1dbf0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1dc00 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1dc10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1dc20 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1dc30 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1dc40 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1dc50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dc60 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1dc70 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1dc80 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
1dc90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1dca0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1dcb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1dcc0 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1dcd0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1dce0 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1dcf0 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1dd00 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1dd10 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1dd20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dd30 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1dd40 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1dd50 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1dd60 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1dd70 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1dd80 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1dd90 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1dda0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1ddb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ddc0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1ddd0 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1dde0 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1ddf0 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1de00 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1de10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1de20 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1de30 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1de40 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1de50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1de60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1de70 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1de80 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1de90 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1deb0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1dec0 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1ded0 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1dee0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1def0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1df00 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1df10 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1df20 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1df30 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1df40 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1df50 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1df60 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1df70 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1df80 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1df90 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1dfa0 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1dfb0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1dfc0 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1dfd0 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1dfe0 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1dff0 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1e000 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1e010 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1e020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e030 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1e040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e050 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1e060 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  RED_LOCK || pPag
1e070 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
1e080 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
1e090 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1e0a0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
1e0b0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1e0c0 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61  e size was not a
1e0d0 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1e0e0 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1e0f0 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ,.  ** determine
1e100 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65   it based on the
1e110 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e120 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1e130 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  he size.  ** of 
1e140 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e150 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  e is not an inte
1e160 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
1e170 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20  the page-size,. 
1e180 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74   ** round down t
1e190 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61  o the nearest pa
1e1a0 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20  ge. Except, any 
1e1b0 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  file larger than
1e1c0 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e   0.  ** bytes in
1e1d0 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65   size is conside
1e1e0 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  red to contain a
1e1f0 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
1e200 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1e210 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  ge==0 ){.    i64
1e220 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1e230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1e240 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1e250 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73   bytes */.    as
1e260 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1e270 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1e280 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1e290 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1e2a0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1e2b0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1e2c0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1e2d0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1e2e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e300 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e320 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
1e330 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1e340 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 50  ize);.    if( nP
1e350 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b  age==0 && n>0 ){
1e360 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31  .      nPage = 1
1e370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1e380 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1e390 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1e3a0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
1e3b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1e3c0 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1e3d0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1e3e0 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1e3f0 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1e400 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1e410 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1e420 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1e430 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1e440 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1e450 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1e460 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1e470 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
1e480 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1e490 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1e4a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e4b0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
1e4c0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
1e4d0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1e4e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1e4f0 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
1e500 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
1e510 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1e520 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
1e530 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
1e540 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
1e550 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
1e560 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
1e570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1e580 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
1e590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e5a0 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
1e5b0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
1e5c0 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
1e5d0 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
1e5e0 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
1e5f0 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
1e600 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
1e610 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
1e620 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
1e630 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
1e640 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
1e650 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
1e660 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
1e670 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
1e680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1e690 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1e6a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1e6b0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
1e6c0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
1e6d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e6e0 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
1e6f0 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
1e700 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
1e710 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
1e720 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
1e730 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
1e740 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
1e750 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
1e760 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
1e770 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
1e780 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
1e790 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
1e7a0 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
1e7b0 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
1e7c0 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
1e7d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1e7e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1e7f0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
1e800 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
1e810 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1e820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1e830 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1e840 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1e850 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1e860 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1e870 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ARED_LOCK || pPa
1e880 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1e890 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
1e8a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1e8b0 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
1e8e0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
1e8f0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1e920 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e930 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
1e940 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1e950 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
1e960 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e970 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
1e980 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1e990 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1e9a0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
1e9b0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
1e9c0 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1e9d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1e9e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e9f0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1ea00 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1ea10 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1ea20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1ea30 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1ea40 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1ea50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ea60 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1ea70 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1ea80 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1ea90 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1eaa0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1eab0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1eac0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ead0 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1eae0 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1eaf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1eb00 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1eb10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
1eb20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1eb30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
1eb40 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1eb50 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
1eb60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1eb70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1eb80 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
1eb90 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
1eba0 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
1ebb0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
1ebc0 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
1ebd0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
1ebe0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1ebf0 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
1ec00 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
1ec10 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
1ec20 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
1ec30 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
1ec40 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
1ec50 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
1ec60 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
1ec70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
1ec80 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
1ec90 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
1eca0 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
1ecb0 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
1ecc0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
1ecd0 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
1ece0 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
1ecf0 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
1ed00 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
1ed10 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
1ed20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
1ed30 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
1ed40 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1ed50 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1ed60 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
1ed70 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
1ed80 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1ed90 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
1eda0 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
1edb0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1edc0 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
1edd0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1ede0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
1edf0 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
1ee00 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1ee10 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
1ee20 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
1ee30 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1ee40 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
1ee50 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
1ee60 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
1ee70 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
1ee80 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1ee90 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
1eea0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
1eeb0 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
1eec0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
1eed0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1eee0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
1eef0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
1ef00 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
1ef10 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1ef20 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
1ef30 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
1ef40 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
1ef50 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
1ef60 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
1ef70 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
1ef80 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
1ef90 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
1efa0 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
1efb0 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
1efc0 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
1efd0 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
1efe0 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
1eff0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
1f000 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
1f010 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
1f020 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
1f030 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1f040 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
1f050 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
1f060 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
1f070 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
1f080 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
1f090 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
1f0a0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
1f0b0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1f0c0 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
1f0d0 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
1f0e0 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
1f0f0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
1f100 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
1f110 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
1f120 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
1f130 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1f140 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
1f150 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
1f160 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
1f170 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
1f180 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
1f190 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
1f1a0 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
1f1b0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1f1c0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
1f1d0 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
1f1e0 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
1f1f0 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
1f200 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
1f210 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
1f220 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
1f230 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
1f240 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
1f250 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
1f260 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
1f270 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
1f280 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
1f290 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
1f2a0 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2c0 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
1f2d0 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
1f2e0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
1f2f0 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
1f300 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
1f310 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
1f320 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
1f330 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
1f340 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1f350 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f360 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1f370 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
1f380 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
1f390 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
1f3a0 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
1f3b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1f3c0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1f3d0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
1f3e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f3f0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1f400 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
1f410 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
1f420 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
1f430 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
1f440 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
1f450 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
1f460 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
1f470 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
1f480 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
1f490 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
1f4a0 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
1f4b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f4c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1f4d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1f4e0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f4f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
1f500 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
1f510 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
1f520 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
1f530 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
1f540 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1f550 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
1f560 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
1f570 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
1f580 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
1f590 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1f5a0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1f5b0 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1f5c0 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
1f5d0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1f5e0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
1f5f0 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
1f600 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
1f610 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
1f620 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
1f630 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1f640 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
1f650 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
1f660 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
1f670 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
1f680 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
1f690 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
1f6a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1f6b0 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
1f6c0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1f6d0 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
1f6e0 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
1f6f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
1f700 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
1f710 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
1f720 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f730 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
1f740 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1f750 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
1f760 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
1f770 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
1f780 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
1f790 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
1f7a0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
1f7b0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
1f7c0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
1f7d0 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
1f7e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
1f7f0 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
1f800 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
1f810 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
1f820 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
1f830 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
1f840 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
1f850 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
1f860 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
1f870 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
1f880 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
1f890 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1f8a0 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
1f8b0 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
1f8c0 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
1f8d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
1f8e0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
1f8f0 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
1f900 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
1f910 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
1f920 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
1f930 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
1f940 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
1f950 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1f960 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
1f970 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
1f980 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1f990 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1f9a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
1f9b0 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
1f9c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1f9d0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1f9e0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
1f9f0 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
1fa00 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1fa10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1fa20 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
1fa30 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1fa40 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1fa50 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
1fa60 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
1fa70 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
1fa80 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1fa90 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
1faa0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
1fab0 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
1fac0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
1fad0 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
1fae0 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
1faf0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
1fb00 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
1fb10 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
1fb20 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
1fb30 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
1fb40 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
1fb50 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
1fb60 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
1fb70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1fb80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fb90 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
1fba0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
1fbb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1fbc0 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
1fbd0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
1fbe0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
1fbf0 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
1fc00 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
1fc10 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
1fc20 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
1fc30 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
1fc40 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1fc50 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1fc60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
1fc70 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
1fc80 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1fc90 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1fca0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1fcb0 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
1fcc0 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
1fcd0 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
1fce0 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
1fcf0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
1fd00 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
1fd10 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
1fd20 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1fd30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1fd40 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
1fd50 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1fd60 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1fd70 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1fd80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1fd90 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
1fda0 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
1fdb0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1fdc0 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
1fdd0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1fde0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
1fdf0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1fe00 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
1fe10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fe20 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
1fe30 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1fe40 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1fe50 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
1fe60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1fe70 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
1fe80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1fe90 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1fea0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
1feb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1fec0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1fed0 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
1fee0 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
1fef0 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
1ff00 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1ff10 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
1ff20 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
1ff30 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
1ff40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
1ff50 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
1ff60 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
1ff70 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
1ff80 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
1ff90 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
1ffa0 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
1ffb0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
1ffc0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
1ffd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1ffe0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1fff0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
20000 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
20010 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
20020 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
20030 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
20040 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
20050 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
20060 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
20070 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
20080 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
20090 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
200a0 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
200b0 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
200c0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
200d0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
200e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
200f0 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70   offset==ii*(4+p
20100 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20110 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
20120 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
20130 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
20140 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
20150 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20160 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20170 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
20180 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
20190 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
201a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
201b0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
201c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
201d0 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
201e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
201f0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
20200 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
20210 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
20220 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
20230 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20240 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
20250 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
20260 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
20270 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
20280 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
20290 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
202a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
202b0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
202c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
202d0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
202e0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
202f0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
20300 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
20310 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
20320 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
20330 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20340 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
20350 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
20360 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
20370 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
20380 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
20390 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
203a0 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
203b0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
203c0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
203d0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
203e0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
203f0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
20400 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
20410 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
20420 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
20430 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
20440 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
20450 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
20460 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
20480 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
20490 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
204a0 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
204b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
204c0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
204d0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
204e0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
204f0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
20500 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
20510 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
20520 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
20530 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
20550 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
20560 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
20570 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
20580 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
20590 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
205a0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
205b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
205c0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
205d0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
205e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
205f0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
20600 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
20610 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
20620 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
20630 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
20640 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
20650 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
20660 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
20670 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
20680 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
20690 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
206a0 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
206b0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
206c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
206d0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
206e0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
206f0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
20700 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
20710 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
20720 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
20730 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20740 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
20750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
20760 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
20770 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
20780 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
20790 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
207a0 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
207b0 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
207c0 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
207d0 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
207e0 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
207f0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
20800 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
20810 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
20820 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
20830 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
20840 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
20850 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
20860 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
20870 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
20880 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
20890 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
208a0 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
208b0 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
208c0 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
208d0 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
208e0 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
208f0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
20900 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
20910 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
20920 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
20930 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
20940 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
20950 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
20960 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
20970 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
20980 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
20990 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
209a0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
209b0 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
209c0 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
209d0 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
209e0 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
209f0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
20a00 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
20a10 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
20a20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
20a30 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
20a40 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
20a50 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
20a60 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
20a70 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
20a80 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
20a90 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
20aa0 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
20ab0 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
20ac0 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
20ad0 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
20ae0 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
20af0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
20b00 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
20b10 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
20b20 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
20b30 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
20b40 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
20b50 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
20b60 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
20b70 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
20b80 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
20b90 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
20ba0 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
20bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
20bc0 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
20bd0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
20be0 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
20bf0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
20c00 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
20c10 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
20c20 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
20c30 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
20c40 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
20c50 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
20c60 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
20c70 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
20c80 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
20c90 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
20ca0 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
20cb0 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
20cc0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
20cd0 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
20ce0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
20cf0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
20d00 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
20d10 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
20d20 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
20d30 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
20d40 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
20d50 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
20d60 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
20d70 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
20d80 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
20d90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
20da0 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
20db0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
20dc0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
20dd0 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
20de0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
20df0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
20e00 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
20e10 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
20e20 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
20e30 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
20e40 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
20e50 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
20e60 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
20e70 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
20e80 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
20e90 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
20ea0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
20eb0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
20ec0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
20ed0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
20ee0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
20ef0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
20f00 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
20f10 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d 0a  C_NORMAL;.  }.}.
20f20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
20f30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
20f40 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
20f50 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
20f60 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
20f70 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
20f80 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
20f90 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
20fa0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
20fb0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
20fc0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
20fd0 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
20fe0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
20ff0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
21000 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
21010 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
21020 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
21030 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
21040 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
21050 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
21060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
21070 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
21080 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
21090 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
210a0 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
210b0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
210c0 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
210d0 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
210e0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
210f0 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
21100 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
21110 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
21120 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
21130 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
21140 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
21150 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
21160 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
21170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21180 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
21190 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
211a0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
211b0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
211c0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
211d0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
211e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
211f0 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
21200 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
21210 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
21220 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
21230 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21240 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
21250 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21260 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
21270 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
21280 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
21290 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
212a0 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
212b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
212c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
212d0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
212e0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
212f0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
21300 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
21310 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
21320 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
21330 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
21340 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
21350 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
21360 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
21370 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
21380 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
21390 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
213a0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
213b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
213c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
213d0 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
213e0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
213f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21400 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
21410 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
21420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
21430 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
21440 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
21450 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
21460 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
21470 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
21480 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
21490 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
214a0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
214b0 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
214c0 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
214d0 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
214e0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
214f0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
21500 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
21510 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
21520 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
21530 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
21540 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
21550 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
21560 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
21570 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
21580 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
21590 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
215a0 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
215b0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
215c0 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
215d0 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
215e0 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
21610 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
21620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21650 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
21660 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
21670 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
21680 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
21690 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
216a0 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
216b0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
216c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
216d0 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
216e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
216f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
21700 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
21710 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
21720 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
21730 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
21740 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
21750 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
21760 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
21770 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
21780 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
21790 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
217a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
217b0 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
217c0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
217d0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
217e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
21810 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
21820 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
21830 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
21840 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
21850 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
21860 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
21870 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21890 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
218a0 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
218b0 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61  er */.){  .  pPa
218c0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
218d0 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
218e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
218f0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
21900 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d  usyHandlerArg;.}
21910 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21920 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
21930 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
21940 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
21950 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
21960 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
21970 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
21980 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
21990 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
219a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
219b0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
219c0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
219d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
219e0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
219f0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
21a00 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
21a10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
21a20 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
21a30 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
21a40 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
21a50 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
21a60 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
21a70 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
21a80 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
21a90 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
21aa0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
21ab0 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
21ac0 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
21ad0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
21ae0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
21af0 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
21b00 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
21b10 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
21b20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
21b30 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
21b40 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
21b50 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
21b60 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
21b70 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
21b80 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
21b90 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
21ba0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
21bb0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
21bc0 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
21bd0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
21be0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
21bf0 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
21c00 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
21c10 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
21c20 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
21c30 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
21c40 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
21c50 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
21c60 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
21c70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
21c80 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
21c90 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
21ca0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
21cb0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
21cc0 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
21cd0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
21ce0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
21cf0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
21d00 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
21d10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
21d20 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
21d30 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
21d40 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
21d50 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
21d60 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
21d70 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
21d80 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
21d90 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
21da0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
21db0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
21dc0 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
21dd0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
21de0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
21df0 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
21e00 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
21e10 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
21e20 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
21e30 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
21e40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21e50 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
21e60 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
21e70 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
21e80 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
21e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21ea0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
21eb0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
21ec0 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
21ed0 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
21ee0 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
21ef0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
21f00 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
21f10 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
21f20 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
21f30 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
21f40 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
21f50 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
21f60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
21f70 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
21f80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
21f90 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
21fa0 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
21fb0 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
21fc0 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
21fd0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
21fe0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
21ff0 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
22000 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
22010 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
22020 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
22030 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
22040 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
22050 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
22060 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
22070 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
22080 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
22090 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
220a0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
220b0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
220c0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
220d0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
220e0 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
220f0 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
22100 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
22110 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
22120 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
22130 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
22140 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
22150 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
22160 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
22170 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
22180 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
22190 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
221a0 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
221b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
221c0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
221d0 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
221e0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
221f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22200 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
22210 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
22220 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
22230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22240 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
22250 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
22260 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
22270 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
22280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22290 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
222a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
222b0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
222c0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
222d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
222e0 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79  ize = (Pgno)(nBy
222f0 74 65 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  te/pageSize);.  
22300 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
22310 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
22320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
22330 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
22340 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
22350 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
22360 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
22370 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
22380 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
22390 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
223a0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ize);.    }.  }.
223b0 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
223c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
223d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
223e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
223f0 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
22400 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
22410 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
22420 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
22430 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
22440 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
22450 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
22460 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
22470 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
22480 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
22490 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
224a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
224b0 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
224c0 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
224d0 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
224e0 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
224f0 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
22500 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
22510 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
22520 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
22530 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
22540 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
22550 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
22560 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
22570 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
22580 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
22590 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
225a0 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
225b0 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
225c0 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
225d0 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
225e0 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
225f0 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
22600 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
22610 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
22620 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
22630 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
22640 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
22650 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
22660 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
22670 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
22680 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
22690 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
226a0 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
226b0 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
226c0 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
226d0 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
226e0 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
226f0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
22700 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
22710 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
22720 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
22730 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
22740 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
22750 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
22760 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
22770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22780 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
22790 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
227a0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
227b0 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
227c0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
227d0 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
227e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
227f0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
22800 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61  EN );      /* Ca
22810 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f  lled only by OP_
22820 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73  MaxPgcnt */.  as
22830 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
22840 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
22850 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d  Size );  /* OP_M
22860 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73  axPgcnt enforces
22870 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72   this */.  retur
22880 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
22890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
228a0 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
228b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
228c0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
228d0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
228e0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
228f0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
22900 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
22910 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
22920 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
22930 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
22940 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
22950 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
22960 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
22970 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
22980 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
22990 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
229a0 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
229b0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
229c0 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
229d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
229e0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
229f0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
22a00 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
22a10 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
22a20 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
22a30 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
22a40 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
22a50 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
22a60 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
22a70 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
22a80 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
22a90 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
22aa0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
22ab0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
22ac0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
22ad0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
22ae0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
22af0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
22b00 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
22b10 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
22b20 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
22b30 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
22b40 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
22b50 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
22b60 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
22b70 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
22b80 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
22b90 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
22ba0 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
22bb0 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
22bc0 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
22bd0 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
22be0 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
22bf0 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
22c00 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
22c10 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
22c20 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
22c30 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
22c40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
22c50 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
22c60 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
22c70 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
22c80 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
22c90 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
22ca0 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
22cb0 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
22cc0 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
22cd0 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
22ce0 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
22cf0 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
22d00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
22d10 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
22d20 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
22d30 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
22d40 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
22d50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
22d60 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
22d70 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
22d80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
22d90 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
22da0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
22db0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
22dc0 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
22dd0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22de0 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
22df0 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
22e00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22e10 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
22e20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
22e30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
22e40 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
22e50 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
22e60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22e70 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
22e80 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
22e90 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
22ea0 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
22eb0 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
22ec0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
22ed0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
22ee0 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
22ef0 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
22f00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
22f10 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
22f20 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
22f30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
22f40 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
22f50 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
22f60 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
22f70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22f80 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
22f90 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
22fa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22fb0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
22fc0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
22fd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22fe0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22ff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
23000 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
23010 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
23020 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
23030 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
23040 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
23050 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
23060 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
23070 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
23080 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
23090 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
230a0 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
230b0 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
230c0 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
230d0 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
230e0 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
230f0 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
23100 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
23110 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
23120 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
23130 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
23140 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
23150 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
23160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
23170 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
23180 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20  ER_FINISHED );. 
23190 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29   *pnPage = (int)
231a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
231b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
231c0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
231d0 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
231e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
231f0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
23200 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
23210 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
23220 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
23230 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
23240 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
23250 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
23260 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
23270 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
23280 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
23290 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
232a0 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
232b0 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
232c0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
232d0 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
232e0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
232f0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
23300 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
23310 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
23320 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
23330 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
23340 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
23350 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
23360 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
23370 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
23380 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
23390 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
233a0 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
233b0 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
233c0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
233d0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
233e0 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
233f0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
23400 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
23410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
23420 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
23430 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23440 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
23450 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23480 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
23490 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
234a0 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
234b0 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
234c0 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
234d0 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
234e0 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
234f0 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
23500 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
23510 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
23520 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
23530 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
23540 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
23550 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
23560 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
23570 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23580 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
23590 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
235a0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
235b0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
235c0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
235d0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
235e0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
235f0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
23600 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
23610 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
23620 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
23630 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
23640 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
23650 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
23660 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
23670 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23680 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
23690 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
236a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
236b0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
236c0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
236d0 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
236e0 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
236f0 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
23700 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
23710 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
23720 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
23730 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
23740 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
23750 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
23760 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
23770 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
23780 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
23790 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
237a0 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
237b0 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
237c0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
237d0 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
237e0 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
237f0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
23800 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
23810 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
23820 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
23830 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
23840 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
23850 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
23860 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
23870 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
23880 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
23890 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
238a0 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
238b0 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
238c0 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
238d0 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
238e0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
238f0 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
23900 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
23910 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
23920 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
23930 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
23940 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
23950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23960 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
23970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
23980 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
23990 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
239a0 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
239b0 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c  t behaviour woul
239c0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
239d0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
239e0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
239f0 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
23a00 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
23a10 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
23a20 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
23a30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
23a40 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
23a50 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
23a60 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
23a70 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
23a80 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
23a90 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
23aa0 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
23ab0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
23ac0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
23ad0 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
23ae0 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
23af0 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
23b00 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
23b10 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
23b20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
23b30 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
23b40 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
23b50 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
23b60 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
23b70 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
23b80 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
23b90 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
23ba0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
23bb0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
23bc0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
23bd0 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
23be0 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
23bf0 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
23c00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
23c10 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
23c20 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
23c30 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
23c40 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
23c50 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
23c60 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
23c70 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
23c80 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
23c90 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
23ca0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
23cb0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
23cc0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
23cd0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
23ce0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
23cf0 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
23d00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
23d10 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
23d20 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
23d30 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
23d40 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
23d50 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
23d60 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
23d70 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
23d80 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
23d90 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
23da0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23db0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
23dc0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
23dd0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
23de0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23df0 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
23e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
23e10 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
23e20 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
23e30 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
23e40 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
23e50 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65    assertTruncate
23e60 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
23e70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  r);.}.../*.** Th
23e80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23e90 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
23ea0 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
23eb0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
23ec0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
23ed0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
23ee0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
23ef0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
23f00 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
23f10 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
23f20 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
23f30 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
23f40 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
23f50 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
23f60 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
23f70 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
23f80 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
23f90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
23fa0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
23fb0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
23fc0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
23fd0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
23fe0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
23ff0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
24000 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
24010 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
24020 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
24030 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
24040 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
24050 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
24060 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
24070 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
24080 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
24090 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
240a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
240b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
240c0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
240d0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
240e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
240f0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
24100 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
24110 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24120 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
24130 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
24140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
24150 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
24160 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
24170 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
24180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
241a0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
241b0 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
241c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
241d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
241e0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
241f0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
24200 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
24210 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
24220 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
24230 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
24240 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
24250 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24260 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
24270 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
24280 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
24290 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
242a0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
242b0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
242c0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
242d0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
242e0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
242f0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
24300 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
24310 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
24320 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
24330 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
24340 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
24350 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
24360 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
24370 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
24380 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
24390 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
243a0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
243b0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
243c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
243d0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
243e0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
243f0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
24400 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
24410 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
24420 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
24430 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
24440 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
24450 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
24460 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
24470 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
24480 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64 69  pTmpSpace;..  di
24490 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
244a0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
244b0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
244c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20  nMalloc();.  /* 
244d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
244e0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
244f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
24500 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
24510 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
24520 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
24530 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
24540 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
24550 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
24560 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70  Size, pTmp);.  p
24570 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
24580 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
24590 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
245a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
245b0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
245c0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
245d0 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
245e0 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
245f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
24600 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
24610 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
24620 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
24630 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
24640 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
24650 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
24660 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
24670 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
24680 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
24690 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
246a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
246b0 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
246c0 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
246d0 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
246e0 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
246f0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
24700 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
24710 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
24720 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
24730 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
24740 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
24750 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
24760 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
24770 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
24780 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
24790 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
247a0 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
247b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
247c0 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
247d0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
247e0 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
247f0 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
24800 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
24810 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
24820 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
24830 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
24840 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
24850 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24860 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
24870 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
24880 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
24890 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
248a0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
248b0 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
248c0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
248d0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
248e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
248f0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
24900 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
24910 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
24920 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
24930 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
24940 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
24950 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
24960 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
24970 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
24980 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
24990 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
249a0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
249b0 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
249c0 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
249d0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
249e0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
249f0 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
24a00 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
24a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
24a20 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
24a30 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
24a40 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
24a50 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
24a60 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
24a70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
24a80 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
24a90 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
24aa0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
24ab0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
24ac0 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
24ad0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
24ae0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
24af0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
24b00 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
24b10 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
24b20 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
24b30 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
24b40 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
24b50 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
24b60 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
24b70 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
24b80 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
24b90 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
24ba0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
24bb0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
24bc0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
24bd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24be0 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
24bf0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
24c00 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
24c10 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
24c20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
24c30 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
24c40 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
24c50 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
24c60 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
24c70 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
24c80 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
24c90 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
24ca0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
24cb0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
24cc0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
24cd0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
24ce0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
24cf0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
24d00 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
24d10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24d20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
24d30 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
24d40 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
24d50 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
24d60 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
24d70 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
24d80 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
24d90 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
24da0 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
24db0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
24dc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
24dd0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
24de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
24df0 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
24e00 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
24e10 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
24e20 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
24e30 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
24e40 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
24e50 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
24e60 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
24e70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
24e80 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
24e90 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
24ea0 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
24eb0 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
24ec0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
24ed0 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
24ee0 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
24ef0 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
24f00 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
24f10 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
24f20 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
24f30 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
24f40 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
24f50 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
24f60 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
24f70 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
24f80 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
24f90 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
24fa0 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
24fb0 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
24fc0 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
24fd0 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
24fe0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
24ff0 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
25000 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
25010 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
25020 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
25030 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
25040 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
25050 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
25060 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
25070 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
25080 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
25090 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
250a0 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
250b0 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
250c0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
250d0 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
250e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
250f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
25100 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
25110 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
25120 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
25130 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
25140 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
25150 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
25160 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
25170 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
25180 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
25190 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
251a0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
251b0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
251c0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
251d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
251e0 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
251f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25210 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25220 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25230 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
25240 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
25250 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
25260 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
25270 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
25280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
25290 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
252a0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
252b0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
252c0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
252d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
252e0 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
252f0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
25300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
25310 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
25320 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
25330 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25340 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
25350 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
25360 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25370 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
25380 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
25390 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
253a0 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
253b0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
253c0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
253d0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
253e0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
253f0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
25400 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
25410 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
25420 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
25430 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
25440 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
25450 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
25460 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
25470 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
25480 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
25490 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
254a0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
254b0 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
254c0 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
254d0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
254e0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
254f0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
25500 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
25510 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
25520 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
25530 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
25540 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
25550 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
25560 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
25570 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
25580 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
25590 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
255a0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
255b0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
255c0 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
255d0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
255e0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
255f0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
25600 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
25610 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
25620 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
25630 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
25640 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
25650 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
25660 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
25670 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
25680 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
25690 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
256a0 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
256b0 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
256c0 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
256d0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
256e0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
256f0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
25700 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
25710 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
25720 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
25730 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
25740 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
25750 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
25760 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
25770 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
25780 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
25790 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
257a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
257b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
257c0 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
257d0 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
257e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
257f0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
25800 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
25810 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
25820 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
25830 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
25840 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
25850 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
25860 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
25870 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
25880 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
25890 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
258a0 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
258b0 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
258c0 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
258d0 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
258e0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
258f0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
25900 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
25910 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
25920 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
25930 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
25940 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
25950 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
25960 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
25970 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
25980 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
25990 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
259a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
259b0 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
259c0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
259d0 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
259e0 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
259f0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
25a00 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
25a10 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
25a20 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
25a30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
25a40 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
25a50 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
25a60 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
25a70 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
25a80 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
25a90 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
25aa0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
25ab0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
25ac0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
25ad0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
25ae0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
25af0 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
25b00 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
25b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25b20 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
25b30 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
25b40 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
25b50 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
25b60 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
25b70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
25b80 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
25b90 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
25ba0 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
25bb0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
25bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
25bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
25be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
25bf0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
25c00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
25c10 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
25c20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
25c30 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
25c40 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
25c50 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
25c60 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
25c70 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
25c80 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
25c90 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
25ca0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
25cb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
25cc0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
25cd0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
25ce0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
25cf0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
25d00 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
25d10 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
25d20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
25d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
25d40 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
25d50 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
25d60 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
25d70 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
25d80 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
25d90 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
25da0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
25db0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
25dc0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
25dd0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
25de0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
25df0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
25e00 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
25e10 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
25e20 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
25e30 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25e40 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
25e50 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
25e60 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
25e70 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
25e80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
25e90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
25ea0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
25eb0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
25ec0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
25ed0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
25ee0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
25ef0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
25f00 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
25f10 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
25f20 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
25f30 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
25f40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
25f50 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
25f60 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
25f70 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
25f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25f90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
25fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
25fb0 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
25fc0 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
25fd0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
25fe0 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
25ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
26000 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
26010 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
26020 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
26030 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
26040 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
26050 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
26060 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26070 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26080 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
26090 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
260a0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
260b0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
260c0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
260d0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
260e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
260f0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
26100 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
26110 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
26120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26130 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
26140 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
26150 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
26160 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
26170 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
26180 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
26190 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
261a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
261b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
261c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
261d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
261e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
261f0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26200 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
26210 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
26220 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
26230 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
26240 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26250 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
26260 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
26270 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
26280 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26290 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
262a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
262b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
262c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
262d0 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
262e0 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
262f0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
26300 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
26310 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
26320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
26330 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
26340 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
26350 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
26360 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
26370 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
26380 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
26390 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
263a0 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
263b0 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
263c0 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
263d0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
263e0 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
263f0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
26400 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
26410 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
26420 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26430 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
26440 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
26450 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
26460 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
26470 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
26480 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
26490 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
264a0 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
264b0 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
264c0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
264d0 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
264e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
264f0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
26500 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
26510 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
26520 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
26530 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
26540 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
26550 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
26560 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
26570 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
26580 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
26590 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
265a0 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
265b0 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
265c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
265d0 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
265e0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
265f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26600 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
26610 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
26620 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
26630 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
26640 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
26650 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
26660 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
26670 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
26680 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
26690 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
266a0 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
266b0 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
266c0 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
266d0 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
266e0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
266f0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
26700 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
26710 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
26720 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
26730 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
26740 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
26750 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
26760 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
26770 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26780 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
26790 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
267a0 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
267b0 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
267c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
267d0 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
267e0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
267f0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
26800 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
26810 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
26820 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
26830 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
26840 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
26850 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
26860 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
26870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26880 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
26890 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
268a0 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
268b0 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
268c0 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
268d0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
268e0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
268f0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
26900 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
26910 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
26920 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
26930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26940 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
26950 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
26960 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
26970 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
26980 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
26990 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
269a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
269b0 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
269c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
269d0 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
269e0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
269f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
26a00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26a10 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
26a20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26a30 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
26a40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26a50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26a60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
26a70 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
26a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
26a90 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
26aa0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
26ab0 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
26ac0 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
26ad0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
26ae0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
26af0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
26b00 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
26b10 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
26b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
26b30 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
26b40 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
26b50 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
26b60 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
26b70 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
26b80 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
26b90 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
26ba0 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
26bb0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
26bc0 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
26bd0 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
26be0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
26bf0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
26c00 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
26c10 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
26c20 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
26c30 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
26c40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
26c50 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
26c60 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
26c70 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
26c80 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
26c90 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
26ca0 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
26cb0 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
26cc0 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
26cd0 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
26ce0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
26cf0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
26d00 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
26d10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
26d20 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
26d30 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
26d40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26d50 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  OK && pPager->db
26d60 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48  Size>pPager->dbH
26d70 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 73  intSize ){.    s
26d80 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
26d90 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
26da0 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
26db0 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
26dc0 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
26dd0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
26de0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
26df0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
26e00 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
26e10 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
26e20 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
26e30 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
26e40 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
26e50 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
26e60 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
26e70 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
26e80 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
26e90 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
26ea0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
26eb0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
26ec0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
26ed0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
26ee0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
26ef0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
26f00 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
26f10 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
26f20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
26f30 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
26f40 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
26f50 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
26f60 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
26f70 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
26f80 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
26f90 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
26fa0 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
26fb0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
26fc0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
26fd0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
26fe0 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
26ff0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
27000 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
27010 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
27020 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
27030 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
27040 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
27050 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
27060 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
27070 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
27080 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
27090 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
270a0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
270e0 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
270f0 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
27100 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
27110 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 0a  ED_SYNC)==0 );..
27120 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
27130 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
27140 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
27150 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
27160 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
27170 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
27180 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
27190 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
271a0 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
271b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
271c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
271d0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
271e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
271f0 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
27200 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
27210 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
27220 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
27230 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
27240 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
27250 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
27260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27270 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
27280 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
27290 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
272a0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
272b0 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
272c0 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
272d0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
272e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
272f0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
27300 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
27310 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
27320 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
27330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27340 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
27350 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
27360 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
27370 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
27380 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27390 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
273a0 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
273b0 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
273c0 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
273d0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
273e0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
273f0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
27400 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
27410 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
27420 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
27430 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
27440 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27460 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27470 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
27480 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
27490 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
274a0 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
274b0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
274c0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
274d0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
274e0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
274f0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
27500 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
27510 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27520 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
27530 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
27540 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
27550 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
27560 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
27570 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
27580 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
27590 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
275a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
275b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
275c0 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
275d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
275e0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
275f0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
27600 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
27610 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
27620 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
27630 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
27640 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
27650 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
27660 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
27670 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
27680 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
27690 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
276a0 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
276b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
276c0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
276d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
276e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
276f0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
27700 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
27710 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
27720 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
27730 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
27740 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
27750 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
27760 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
27770 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
27780 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
27790 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
277a0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
277b0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
277c0 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
277d0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
277e0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
277f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27800 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
27810 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
27820 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
27830 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
27840 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
27850 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
27860 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
27870 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
27880 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
27890 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
278a0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
278b0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
278c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
278d0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
278e0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
278f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
27900 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
27910 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
27920 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
27930 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
27940 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
27950 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
27960 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
27970 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
27980 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
27990 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
279a0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
279b0 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
279c0 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
279d0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
279e0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
279f0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
27a00 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
27a10 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
27a20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
27a30 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
27a40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
27a50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27a60 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
27a70 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27a80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
27a90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
27aa0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
27ab0 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
27ac0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
27ad0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
27ae0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
27af0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
27b00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
27b10 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
27b20 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
27b30 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
27b40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
27b50 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
27b60 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27b70 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
27b80 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
27b90 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
27ba0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
27bb0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
27bc0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
27bd0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
27be0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
27bf0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
27c00 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
27c10 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
27c20 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
27c30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
27c40 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
27c50 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
27c60 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
27c70 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
27c80 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
27c90 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
27ca0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
27cc0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
27cd0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
27ce0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
27cf0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
27d00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
27d10 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
27d20 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
27d30 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
27d40 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
27d50 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
27d60 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
27d70 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
27d80 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
27d90 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
27da0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
27db0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
27dc0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
27dd0 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
27de0 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
27df0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
27e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27e10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27e20 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
27e30 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
27e40 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
27e50 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
27e60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27e70 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
27e80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
27e90 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
27ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27eb0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
27ec0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
27ed0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
27ee0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
27ef0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
27f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27f10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
27f20 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
27f30 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
27f40 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
27f50 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
27f60 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
27f70 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
27f80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
27f90 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
27fa0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
27fb0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
27fc0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
27fd0 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
27fe0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
27ff0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
28000 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
28010 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
28020 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
28030 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
28040 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
28050 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
28060 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
28070 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
28080 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
28090 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
280a0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
280b0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
280c0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
280d0 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
280e0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
280f0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
28100 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
28110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28120 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
28130 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
28140 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
28150 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
28160 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
28170 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
28180 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
28190 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
281a0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
281b0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
281c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
281d0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
281e0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
281f0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
28200 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
28210 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
28220 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
28230 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
28240 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
28250 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
28260 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
28270 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
28280 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
28290 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
282a0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
282b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
282c0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
282d0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
282e0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
282f0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
28300 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28310 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
28320 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
28330 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
28340 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
28350 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
28360 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
28370 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
28380 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
28390 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
283a0 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
283b0 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
283c0 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
283d0 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
283e0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
283f0 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
28400 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
28410 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
28420 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
28430 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
28440 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
28450 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
28460 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
28470 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
28480 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
28490 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
284a0 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
284b0 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
284c0 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
284d0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
284e0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
284f0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
28500 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
28510 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
28520 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
28530 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
28540 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
28550 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
28560 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
28570 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20  ementaton it .  
28580 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
28590 20 66 6f 72 20 73 71 6c 69 74 65 33 50 43 61 63   for sqlite3PCac
285a0 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
285b0 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
285c0 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77  teFlag==1.  ** w
285d0 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
285e0 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
285f0 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
28600 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
28610 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
28620 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
28630 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
28640 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
28650 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
28660 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
28670 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
28680 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
28690 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
286a0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
286b0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
286c0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
286d0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
286e0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29  er->doNotSpill )
286f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28700 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
28710 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20  >doNotSyncSpill 
28720 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  && (pPg->flags &
28730 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28740 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
28750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28760 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
28770 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
28780 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
28790 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
287a0 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
287b0 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
287c0 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
287d0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
287e0 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
287f0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
28800 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
28810 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
28820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28830 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
28840 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
28850 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  pPg, 0, 0, 0);. 
28860 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
28870 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
28880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
28890 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
288a0 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
288b0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
288c0 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
288d0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
288e0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
288f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
28900 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
28910 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ager, 1);.    }.
28920 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
28930 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
28940 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
28950 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
28960 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20  rent size of.   
28970 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
28980 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
28990 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
289a0 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
289b0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69  rnal..    ** Thi
289c0 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
289d0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
289e0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
289f0 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
28a00 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77     ** actually w
28a10 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
28a20 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
28a30 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
28a40 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66  * Consider the f
28a50 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
28a60 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20  e of events:.   
28a70 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47   **.    **   BEG
28a80 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  IN;.    **     <
28a90 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
28aa0 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69      **     <modi
28ab0 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  fy page X>.    *
28ac0 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
28ad0 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sp;.    **      
28ae0 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
28af0 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
28b00 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s>.    **       
28b10 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
28b20 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52   X).    **     R
28b30 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
28b40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
28b50 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
28b60 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
28b70 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
28b80 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
28b90 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  n.    ** out to 
28ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28bb0 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
28bc0 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
28bd0 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20  cache. Then,.   
28be0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
28bf0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
28c00 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
28c10 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
28c20 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61  l read.    ** da
28c30 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
28c40 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
28c50 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
28c60 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
28c70 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  .    ** was when
28c80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28c90 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
28ca0 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
28cb0 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20  VEPOINT sp".    
28cc0 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
28cd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
28ce0 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
28cf0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
28d00 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
28d10 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
28d20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
28d30 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
28d40 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
28d50 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
28d60 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  it will.    ** b
28d70 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
28d80 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
28d90 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
28da0 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
28db0 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
28dc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
28dd0 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d  VER(.        rc=
28de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
28df0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
28e00 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
28e10 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
28e20 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72      ) ){.      r
28e30 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
28e40 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
28e50 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
28e60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
28e70 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
28e80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28e90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
28ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28eb0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
28ec0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
28ed0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
28ee0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
28ef0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
28f00 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
28f10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
28f20 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
28f30 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
28f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28f50 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28f60 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
28f70 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28f80 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
28f90 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
28fa0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
28fb0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
28fc0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
28fd0 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
28fe0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
28ff0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
29000 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
29010 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
29020 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
29030 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
29040 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
29050 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
29060 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
29070 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
29080 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
29090 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
290a0 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
290b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
290c0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
290d0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
290e0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
290f0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
29100 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
29110 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
29120 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
29130 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
29140 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
29150 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
29160 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
29170 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
29180 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
29190 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
291a0 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
291b0 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
291c0 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
291d0 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
291e0 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
291f0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
29200 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
29210 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
29220 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
29230 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
29240 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
29250 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
29260 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
29270 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
29280 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
29290 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
292a0 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
292b0 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
292c0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
292d0 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
292e0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
292f0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
29300 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
29310 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
29320 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
29330 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
29340 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
29350 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
29360 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
29370 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  e PAGER_OMIT_JOU
29380 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e  RNAL and PAGER_N
29390 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73  O_READLOCK flags
293a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
293b0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
293c0 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
293d0 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
293e0 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
293f0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
29400 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
29410 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
29420 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
29430 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
29440 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
29450 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
29460 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
29470 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
29480 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
29490 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
294a0 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
294b0 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
294c0 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
294d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
294e0 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
294f0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
29500 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
29510 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
29520 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
29530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
29540 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
29550 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
29560 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
29570 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
29580 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
29590 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
295a0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
295b0 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
295c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
295d0 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
295e0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
295f0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
29600 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
29610 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
29620 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
29630 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
29640 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
29650 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
29660 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
29670 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
29680 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
29690 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
296a0 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
296b0 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
296c0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
296d0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
296e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
296f0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
29700 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
29710 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
29720 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
29730 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
29740 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
29750 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
29760 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
29770 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
29780 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
29790 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
297a0 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
297b0 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
297c0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
297d0 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
297e0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
297f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29800 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
29810 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
29820 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
29830 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
29840 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
29850 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
29860 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
29870 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
29880 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
29890 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
298a0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
298b0 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
298c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
298d0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
298e0 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
298f0 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
29900 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
29910 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
29920 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
29930 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
29940 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
29950 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
29960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29970 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
29980 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
29990 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
299a0 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
299b0 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
299c0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
299d0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
299e0 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
299f0 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
29a00 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
29a10 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
29a20 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
29a30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d  ;  /* True to om
29a40 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  it read-lock */.
29a50 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
29a60 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
29a70 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
29a80 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
29a90 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
29aa0 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c  .  u32 szPageDfl
29ab0 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
29ac0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
29ad0 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
29ae0 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ize */..  /* Fig
29af0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
29b00 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
29b10 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
29b20 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
29b30 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
29b40 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
29b50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
29b60 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
29b70 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
29b80 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
29b90 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
29ba0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
29bb0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
29bc0 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
29bd0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
29be0 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
29bf0 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
29c00 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
29c10 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
29c20 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
29c30 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
29c40 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
29c50 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
29c60 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
29c70 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
29c80 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
29c90 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
29ca0 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
29cb0 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
29cc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
29cd0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
29ce0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
29cf0 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
29d00 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
29d10 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
29d20 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
29d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
29d40 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
29d50 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
29d60 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
29d70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
29d80 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
29d90 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
29da0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
29db0 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
29dc0 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
29dd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
29de0 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
29df0 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
29e00 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
29e10 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  1;.    zFilename
29e20 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
29e30 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
29e40 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
29e50 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
29e60 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
29e70 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
29e80 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
29e90 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
29ea0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
29eb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
29ec0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
29ed0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
29ee0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
29ef0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
29f00 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
29f10 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
29f20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
29f30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
29f40 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
29f50 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
29f60 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
29f70 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
29f80 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
29f90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29fa0 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e      }.    zPathn
29fb0 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d  ame[0] = 0; /* M
29fc0 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c  ake sure initial
29fd0 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c  ized even if Ful
29fe0 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c  lPathname() fail
29ff0 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  s */.    rc = sq
2a000 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
2a010 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2a020 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
2a030 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2a040 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2a050 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2a060 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2a070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a080 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2a090 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2a0a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2a0b0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2a0c0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2a0d0 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2a0e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2a0f0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2a100 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2a110 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2a120 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2a130 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2a140 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2a150 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2a160 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2a170 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2a180 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2a190 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2a1a0 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2a1b0 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2a1c0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2a1d0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2a1e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2a1f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2a200 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2a210 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2a220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a230 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
2a240 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2a250 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2a260 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2a270 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2a280 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2a290 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2a2a0 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2a2b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a2c0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2a2d0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2a2e0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2a2f0 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2a300 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2a310 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2a320 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2a330 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2a350 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2a360 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2a370 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2a380 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2a390 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2a3a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2a3b0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2a3c0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2a3d0 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2a3e0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2a3f0 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2a400 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2a410 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2a420 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2a430 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2a440 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2a450 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2a460 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2a470 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2a480 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2a490 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2a4a0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2a4b0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2a4c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2a4d0 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2a4e0 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2a4f0 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2a500 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2a510 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2a520 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2a530 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2a540 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2a550 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2a560 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2a570 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2a580 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2a590 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2a5a0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2a5b0 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2a5c0 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2a5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a5e0 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2a5f0 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2a600 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  name + 1 +      
2a610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
2a620 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2a630 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20  athname + 8 + 1 
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a650 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2a660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a670 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2a680 61 6d 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20  ame + 4 + 1     
2a690 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2a6a0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2a6b0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2a6c0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2a6d0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2a6e0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2a6f0 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2a700 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2a710 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
2a720 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2a730 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
2a740 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2a750 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2a760 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2a770 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2a780 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2a790 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2a7a0 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2a7b0 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2a7c0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2a7d0 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2a7e0 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2a7f0 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2a800 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2a810 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2a820 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2a830 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2a840 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2a850 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2a860 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2a870 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2a880 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2a890 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2a8a0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2a8b0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2a8c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2a8d0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2a8e0 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2a8f0 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2a900 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2a910 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2a920 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2a930 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2a940 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2a950 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2a960 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2a970 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2a980 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1);.    memcpy(p
2a990 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2a9a0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2a9b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2a9c0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2a9d0 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2a9e0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2a9f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2aa00 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2aa10 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
2aa20 2c 20 38 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 8);.#ifndef SQ
2aa30 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2aa40 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2aa50 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2aa60 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2aa70 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2aa80 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2aa90 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2aaa0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2aab0 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2aac0 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20  hname], "-wal", 
2aad0 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  4);.#endif.    s
2aae0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
2aaf0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2ab00 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2ab10 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2ab20 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2ab30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2ab40 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2ab50 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2ab60 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2ab70 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2ab80 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2ab90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2aba0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2abb0 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2abc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2abd0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2abe0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2abf0 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2ac00 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2ac10 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2ac20 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2ac30 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
2ac40 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
2ac50 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
2ac60 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
2ac70 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
2ac80 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
2ac90 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
2aca0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2acb0 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
2acc0 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
2acd0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2ace0 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
2acf0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
2ad00 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
2ad10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2ad20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
2ad30 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
2ad40 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
2ad50 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
2ad60 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
2ad70 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
2ad80 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
2ad90 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
2ada0 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
2adb0 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
2adc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2add0 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
2ade0 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63   ){.      setSec
2adf0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2ae00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51  .      assert(SQ
2ae10 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2ae20 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
2ae30 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2ae40 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
2ae50 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2ae60 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2ae70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
2ae80 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2ae90 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
2aea0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
2aeb0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
2aec0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
2aed0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2aee0 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  SIZE;.        }e
2aef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2af00 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2af10 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2af20 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
2af30 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2af40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2af50 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b  IC_WRITE.      {
2af60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63  .        int iDc
2af70 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2af80 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2af90 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2afa0 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
2afb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2afc0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2afd0 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
2afe0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2aff0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2b000 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2b010 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
2b020 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2b030 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2b040 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2b050 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
2b060 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
2b070 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2b080 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
2b090 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2b0a0 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2b0b0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2b0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b0d0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
2b0e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2b100 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65  endif.    }.  }e
2b110 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2b120 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2b130 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2b140 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2b150 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2b160 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2b170 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2b180 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2b190 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2b1a0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2b1b0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2b1c0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2b1d0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2b1e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2b1f0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2b200 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2b210 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2b220 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2b230 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2b240 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2b250 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2b260 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2b270 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2b280 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2b290 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2b2a0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
2b2b0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2b2c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2b2d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2b2e0 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  DER;.    pPager-
2b2f0 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2b300 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61  VE_LOCK;.    rea
2b310 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67  dOnly = (vfsFlag
2b320 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s&SQLITE_OPEN_RE
2b330 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20  ADONLY);.  }..  
2b340 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2b350 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65   call to PagerSe
2b360 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76  tPagesize() serv
2b370 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61  es to set the va
2b380 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67  lue of .  ** Pag
2b390 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20  er.pageSize and 
2b3a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
2b3b0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
2b3c0 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  buffer..  */.  i
2b3d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b3e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2b3f0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
2b400 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2b410 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
2b420 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a  size(pPager, &sz
2b430 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20  PageDflt, -1);. 
2b440 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
2b450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2b460 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
2b470 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
2b480 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
2b490 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65  ocks above, free
2b4a0 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
2b4b0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
2b4c0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
2b4d0 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51   */.  if( rc!=SQ
2b4e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2b4f0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2b500 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20  pTmpSpace );.   
2b510 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2b520 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2b530 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
2b540 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
2b550 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
2b560 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2b570 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2b580 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
2b590 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74  a<1000 );.  nExt
2b5a0 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2b5b0 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ra);.  sqlite3Pc
2b5c0 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
2b5d0 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
2b5e0 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mDb,.           
2b5f0 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2b600 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2b610 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2b620 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2b630 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2b640 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
2b650 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
2b660 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
2b670 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  ->zFilename));. 
2b680 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
2b690 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
2b6a0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2b6b0 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d  ame))..  pPager-
2b6c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
2b6d0 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
2b6e0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
2b6f0 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b  ck = (noReadlock
2b700 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31   && readOnly) ?1
2b710 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  :0;.  /* pPager-
2b720 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2b730 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2b740 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2b750 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2b760 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2b770 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2b780 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2b790 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2b7a0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2b7b0 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2b7c0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2b7d0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2b7e0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2b7f0 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2b800 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2b810 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
2b820 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2b830 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
2b840 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2b850 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
2b860 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70  );.#endif.  /* p
2b870 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2b880 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2b890 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2b8a0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2b8b0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2b8c0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b8d0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2b8e0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2b8f0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b900 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2b910 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2b920 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2b930 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2b940 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2b950 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2b960 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2b970 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2b980 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2b990 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2b9a0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2b9b0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2b9c0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2b9d0 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2b9e0 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2b9f0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2ba00 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2ba10 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2ba20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
2ba30 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Sync = pPager->n
2ba40 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50  oSync ?0:1;.  pP
2ba50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
2ba60 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
2ba70 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 53 59   ? 0 : SQLITE_SY
2ba80 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61  NC_NORMAL;.  pPa
2ba90 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2baa0 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  gs = pPager->syn
2bab0 63 46 6c 61 67 73 3b 0a 20 20 2f 2a 20 70 50 61  cFlags;.  /* pPa
2bac0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2bad0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2bae0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2baf0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2bb00 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2bb10 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2bb20 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2bb30 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2bb40 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2bb50 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2bb60 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2bb70 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2bb80 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2bb90 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2bba0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2bbb0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2bbc0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2bbd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2bbe0 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2bbf0 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2bc00 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2bc10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2bc20 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2bc30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2bc40 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2bc50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2bc60 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2bc70 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2bc80 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2bc90 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2bca0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2bcb0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2bcc0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2bcd0 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2bce0 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
2bcf0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
2bd00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bd10 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
2bd20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2bd30 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2bd40 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2bd50 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2bd60 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2bd70 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2bd80 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2bd90 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2bda0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2bdb0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2bdc0 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2bdd0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2bde0 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2bdf0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2be00 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2be10 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2be20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2be30 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2be40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2be50 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2be60 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2be70 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2be80 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2be90 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2bea0 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2beb0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2bec0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2bed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2bee0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2bef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2bf00 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2bf10 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2bf20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2bf30 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2bf40 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2bf50 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2bf60 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2bf70 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2bf80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2bf90 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2bfa0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2bfb0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2bfc0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2bfd0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2bfe0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2bff0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2c000 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2c010 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2c020 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2c030 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2c040 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2c050 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2c060 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2c070 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2c080 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2c090 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2c0a0 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2c0b0 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2c0c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2c0d0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2c0e0 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2c0f0 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2c100 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2c110 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2c120 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2c130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2c140 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2c150 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2c160 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2c170 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2c180 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2c190 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2c1a0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2c1b0 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2c1c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c1d0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2c1e0 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2c1f0 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2c200 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2c210 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2c220 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2c230 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2c240 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2c250 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2c260 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2c270 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2c280 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2c290 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2c2a0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2c2b0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2c2c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2c2d0 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2c2e0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2c2f0 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2c300 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2c310 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2c320 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2c330 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2c340 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2c350 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2c360 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2c370 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2c380 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2c390 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2c3a0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2c3b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2c3c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c3d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2c3e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2c3f0 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2c400 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2c410 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2c420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2c430 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2c440 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2c450 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2c460 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2c470 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2c480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2c490 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2c4a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2c4b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2c4c0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2c4d0 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2c4e0 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2c4f0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2c500 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2c510 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2c520 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2c530 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2c540 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2c550 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2c560 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2c570 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2c580 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2c590 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2c5a0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2c5b0 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2c5c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c5d0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2c5e0 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c600 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2c610 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2c620 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2c630 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2c640 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2c650 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2c660 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2c670 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2c680 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2c690 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2c6a0 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2c6b0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2c6c0 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2c6d0 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2c6e0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2c6f0 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2c700 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2c710 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2c720 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2c730 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2c740 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2c750 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2c760 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2c770 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2c780 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2c790 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2c7a0 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2c7b0 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2c7c0 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2c7d0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2c7e0 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2c7f0 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2c800 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2c810 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2c820 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2c830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c840 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2c850 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2c860 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2c870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c880 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2c890 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c8b0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2c8c0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2c8d0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43  e */..      /* C
2c8e0 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66  heck the size of
2c8f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c900 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73  le. If it consis
2c910 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20  ts of 0 pages,. 
2c920 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c       ** then del
2c930 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2c940 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65  file. See the he
2c950 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f  ader comment abo
2c960 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  ve for .      **
2c970 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68   the reasoning h
2c980 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ere.  Delete the
2c990 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
2c9a0 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20  l file under.   
2c9b0 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44     ** a RESERVED
2c9c0 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72   lock to avoid r
2c9d0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ace conditions a
2c9e0 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c  nd to avoid viol
2c9f0 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b  ating.      ** [
2ca00 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a  H33020]..      *
2ca10 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
2ca20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2ca30 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2ca40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ca50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ca60 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
2ca70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ca80 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
2ca90 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
2caa0 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
2cab0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
2cac0 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
2cad0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2cae0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2caf0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2cb00 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
2cb10 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2cb20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2cb30 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
2cb40 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2cb50 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2cb60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2cb70 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2cb80 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2cb90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2cba0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
2cbb0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2cbc0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
2cbd0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
2cbe0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
2cbf0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
2cc00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2cc10 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
2cc20 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
2cc30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
2cc40 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
2cc50 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
2cc60 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2cc70 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
2cc80 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
2cc90 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
2cca0 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
2ccb0 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
2ccc0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
2ccd0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
2cce0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
2ccf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2cd00 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2cd10 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
2cd20 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2cd30 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2cd40 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2cd50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2cd60 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2cd70 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2cd80 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2cd90 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2cda0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cdb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cdc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cdd0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2cde0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2cdf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2ce00 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2ce10 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
2ce20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2ce30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ce40 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
2ce50 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
2ce60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ce70 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
2ce80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ce90 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ceb0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2cec0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
2ced0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cee0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
2cef0 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
2cf00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2cf10 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2cf20 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
2cf30 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
2cf40 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
2cf50 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
2cf60 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
2cf70 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
2cf80 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
2cf90 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
2cfa0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
2cfb0 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
2cfc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2cfd0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
2cfe0 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
2cff0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
2d000 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
2d010 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
2d020 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
2d030 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
2d040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2d050 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
2d060 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
2d070 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
2d080 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
2d090 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
2d0a0 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
2d0b0 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
2d0c0 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
2d0d0 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
2d0e0 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
2d0f0 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
2d100 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
2d110 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
2d120 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
2d130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
2d140 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
2d150 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
2d160 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2d170 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2d180 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
2d190 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d1a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2d1b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d1c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2d1d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d1e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d1f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2d200 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
2d210 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2d220 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
2d230 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
2d240 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2d250 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
2d260 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
2d270 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
2d280 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
2d290 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
2d2a0 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
2d2b0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
2d2c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2d2d0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2d2e0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
2d2f0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
2d300 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
2d310 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
2d320 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2d330 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
2d340 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
2d350 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
2d360 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
2d370 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2d380 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
2d390 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2d3a0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
2d3b0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
2d3c0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2d3d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
2d3e0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
2d3f0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
2d400 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
2d410 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
2d420 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
2d430 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
2d440 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
2d450 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
2d460 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
2d470 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
2d480 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
2d490 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
2d4a0 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
2d4b0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
2d4c0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
2d4d0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
2d4e0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
2d4f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d500 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
2d510 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
2d520 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
2d530 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
2d540 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
2d550 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2d560 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2d570 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
2d580 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
2d590 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
2d5a0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2d5b0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
2d5c0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
2d5d0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
2d5e0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
2d5f0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
2d600 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
2d610 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
2d620 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
2d630 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2d640 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
2d650 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
2d660 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
2d670 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
2d680 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2d690 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2d6a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2d6b0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2d6c0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
2d6d0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
2d6e0 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
2d6f0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2d700 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
2d710 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
2d720 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
2d730 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2d740 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2d750 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
2d760 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
2d770 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2d780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d7a0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d7b0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2d7c0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
2d7d0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
2d7e0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
2d7f0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
2d800 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
2d810 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
2d820 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
2d830 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
2d840 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
2d850 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
2d860 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
2d870 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2d880 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
2d890 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
2d8a0 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
2d8b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
2d8c0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2d8d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2d8e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
2d8f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2d900 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
2d910 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2d920 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2d930 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2d940 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
2d950 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
2d960 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2d970 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
2d980 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2d990 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
2d9a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2d9b0 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
2d9c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2d9d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
2d9e0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
2d9f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2da00 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
2da10 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
2da20 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2da30 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
2da40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2da50 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20  oReadlock==0 || 
2da60 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2da70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   );..    if( pPa
2da80 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d  ger->noReadlock=
2da90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2daa0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
2dab0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
2dac0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2dad0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dae0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2daf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
2db00 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
2db10 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
2db20 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
2db30 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2db40 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
2db50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
2db60 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2db70 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
2db80 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
2db90 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
2dba0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2dbb0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
2dbc0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2dbd0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
2dbe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dbf0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
2dc00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
2dc10 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
2dc20 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
2dc30 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
2dc40 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2dc50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dc60 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2dc70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
2dc80 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
2dc90 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
2dca0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2dcb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2dcc0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
2dcd0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
2dce0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
2dcf0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2dd00 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
2dd10 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
2dd20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
2dd30 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
2dd40 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
2dd50 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
2dd60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2dd70 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
2dd80 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
2dd90 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
2dda0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
2ddb0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2ddc0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
2ddd0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
2dde0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
2ddf0 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
2de00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
2de10 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
2de20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
2de30 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
2de40 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2de50 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
2de60 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
2de70 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
2de80 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
2de90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2dea0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
2deb0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
2dec0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
2ded0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
2dee0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
2def0 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
2df00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2df10 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
2df20 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
2df30 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
2df40 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2df50 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2df60 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
2df70 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
2df80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
2df90 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
2dfa0 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
2dfb0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2dfc0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2dfd0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
2dfe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2dff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e000 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2e010 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
2e020 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
2e030 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
2e040 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
2e050 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
2e060 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
2e070 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
2e080 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
2e090 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
2e0a0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
2e0b0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
2e0c0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
2e0d0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
2e0e0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
2e0f0 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
2e100 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
2e110 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
2e120 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
2e130 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
2e140 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
2e150 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
2e160 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
2e170 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
2e180 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
2e190 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
2e1a0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
2e1b0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
2e1c0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
2e1d0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
2e1e0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2e1f0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
2e200 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
2e210 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
2e220 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
2e230 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
2e240 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
2e250 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
2e260 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
2e270 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
2e280 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
2e290 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
2e2a0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
2e2b0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
2e2c0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
2e2d0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
2e2e0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
2e2f0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2e300 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
2e310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2e320 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2e330 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e340 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2e350 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2e360 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
2e370 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2e380 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
2e390 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
2e3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2e3b0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2e3c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
2e3d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2e3e0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
2e3f0 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
2e400 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2e410 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2e420 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
2e430 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
2e440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2e450 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
2e460 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
2e470 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2e480 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
2e490 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2e4a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2e4b0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2e4c0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2e4d0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
2e4e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2e4f0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2e500 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2e510 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2e520 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
2e530 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
2e540 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2e550 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2e560 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2e570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e580 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
2e590 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
2e5a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2e5b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2e5c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2e5d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2e5e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2e5f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e600 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
2e610 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
2e620 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
2e630 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
2e640 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
2e650 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
2e660 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
2e670 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
2e680 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
2e690 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
2e6a0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
2e6b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
2e6c0 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
2e6d0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
2e6e0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
2e6f0 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
2e700 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
2e710 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
2e720 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
2e730 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
2e740 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
2e750 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
2e760 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
2e770 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
2e780 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
2e790 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
2e7a0 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
2e7b0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
2e7c0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
2e7d0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
2e7e0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
2e7f0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2e800 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2e810 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e820 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2e830 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
2e840 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2e850 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2e860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e870 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2e880 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2e890 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
2e8a0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2e8b0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
2e8c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2e8d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2e8e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
2e8f0 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
2e900 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2e910 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2e920 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
2e930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e940 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2e950 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
2e960 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e970 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2e980 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
2e990 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
2e9a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
2e9b0 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
2e9c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
2e9d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2e9e0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
2e9f0 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
2ea00 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
2ea10 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
2ea20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
2ea30 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
2ea40 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
2ea50 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
2ea60 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
2ea70 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
2ea80 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
2ea90 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
2eaa0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
2eab0 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
2eac0 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
2ead0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
2eae0 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
2eaf0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
2eb00 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
2eb10 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
2eb20 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
2eb30 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
2eb40 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
2eb50 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
2eb60 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
2eb70 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
2eb80 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
2eb90 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
2eba0 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
2ebb0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
2ebc0 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
2ebd0 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
2ebe0 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
2ebf0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
2ec00 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
2ec10 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
2ec20 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
2ec30 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2ec40 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
2ec50 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
2ec60 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
2ec70 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
2ec80 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
2ec90 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
2eca0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
2ecb0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
2ecc0 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
2ecd0 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
2ece0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
2ecf0 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
2ed00 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
2ed10 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
2ed20 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2ed30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2ed40 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
2ed50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2ed60 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2ed70 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
2ed80 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
2ed90 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
2eda0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
2edb0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
2edc0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
2edd0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
2ede0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
2edf0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2ee00 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2ee10 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ile .     && (pP
2ee20 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c  ager->pBackup ||
2ee30 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
2ee40 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
2ee50 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20  pPCache)>0) .   
2ee60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2ee70 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
2ee80 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
2ee90 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
2eea0 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
2eeb0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
2eec0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
2eed0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
2eee0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
2eef0 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
2ef00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
2ef10 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
2ef20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
2ef30 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
2ef40 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
2ef50 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
2ef60 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
2ef70 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
2ef80 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
2ef90 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
2efa0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
2efb0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
2efc0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
2efd0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
2efe0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
2eff0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
2f000 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
2f010 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
2f020 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
2f030 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
2f040 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
2f050 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
2f060 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
2f070 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
2f080 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
2f090 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
2f0a0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
2f0b0 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
2f0c0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
2f0d0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
2f0e0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
2f0f0 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
2f100 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
2f110 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
2f120 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
2f130 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
2f140 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
2f150 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
2f160 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
2f170 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
2f180 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20     Pgno nPage = 
2f190 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
2f1a0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
2f1b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2f1c0 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  rs)];..      rc 
2f1d0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2f1e0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2f1f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2f200 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20   goto failed;.. 
2f210 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
2f220 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
2f230 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
2f240 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
2f250 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2f260 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
2f270 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2f280 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
2f290 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
2f2a0 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
2f2b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f2c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f2d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
2f2e0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
2f2f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f300 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
2f310 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
2f320 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
2f330 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2f340 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
2f350 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
2f360 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
2f370 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
2f380 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
2f390 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
2f3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2f3b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2f3c0 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
2f3d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2f3e0 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
2f3f0 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
2f400 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
2f410 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
2f420 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
2f430 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2f440 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2f450 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
2f460 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64  t(pPager);.#ifnd
2f470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2f480 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  AL.    assert( p
2f490 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
2f4a0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2f4b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
2f4c0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2f4d0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2f4e0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2f4f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
2f500 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
2f510 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2f520 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
2f530 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2f540 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
2f550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f560 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2f570 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2f580 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2f590 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
2f5a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f5b0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2f5c0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
2f5d0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
2f5e0 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
2f5f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2f600 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2f610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2f620 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2f630 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a  GER_READER;.  }.
2f640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f650 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
2f660 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
2f670 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
2f680 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
2f690 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
2f6a0 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
2f6b0 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
2f6c0 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
2f6d0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
2f6e0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
2f6f0 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
2f700 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
2f710 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
2f720 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
2f730 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
2f740 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
2f750 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
2f760 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2f770 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
2f780 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
2f790 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
2f7a0 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
2f7b0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2f7c0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2f7d0 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
2f7e0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
2f7f0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
2f800 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
2f810 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
2f820 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
2f830 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
2f840 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
2f850 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
2f860 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
2f870 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
2f880 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
2f890 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
2f8a0 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
2f8b0 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
2f8c0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f8d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
2f8e0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
2f8f0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2f900 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
2f910 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
2f920 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
2f930 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
2f940 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
2f950 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
2f960 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
2f970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2f980 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
2f990 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
2f9a0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
2f9b0 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
2f9c0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
2f9d0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
2f9e0 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
2f9f0 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
2fa00 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2fa10 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
2fa20 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
2fa30 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
2fa40 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
2fa50 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
2fa60 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
2fa70 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
2fa80 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
2fa90 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
2faa0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
2fab0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
2fac0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2fad0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
2fae0 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
2faf0 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
2fb00 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
2fb10 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
2fb20 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
2fb30 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2fb40 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
2fb50 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
2fb60 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
2fb70 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
2fb80 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
2fb90 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
2fba0 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
2fbb0 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
2fbc0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
2fbd0 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
2fbe0 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
2fbf0 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
2fc00 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
2fc10 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
2fc20 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
2fc30 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
2fc40 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
2fc50 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
2fc60 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
2fc70 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
2fc80 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
2fc90 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
2fca0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
2fcb0 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
2fcc0 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
2fcd0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
2fce0 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
2fcf0 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
2fd00 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
2fd10 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
2fd20 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
2fd30 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
2fd40 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
2fd50 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
2fd60 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
2fd70 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
2fd80 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
2fd90 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
2fda0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
2fdb0 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
2fdc0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
2fdd0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
2fde0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2fdf0 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
2fe00 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
2fe10 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
2fe20 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2fe30 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
2fe40 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
2fe50 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
2fe60 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
2fe70 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
2fe80 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
2fe90 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2fea0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2feb0 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
2fec0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
2fed0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
2fee0 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
2fef0 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
2ff00 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
2ff10 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
2ff20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
2ff30 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
2ff40 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
2ff50 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
2ff60 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
2ff70 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
2ff80 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
2ff90 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
2ffa0 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
2ffb0 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
2ffc0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
2ffd0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
2ffe0 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
2fff0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
30000 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30010 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
30020 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
30030 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
30040 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
30050 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
30060 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
30070 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
30080 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
30090 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
300a0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
300b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
300c0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
300d0 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
300e0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
300f0 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
30100 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
30110 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
30120 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
30130 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
30140 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
30150 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
30160 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
30170 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
30180 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
30190 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
301a0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
301b0 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
301c0 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
301d0 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
301e0 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
301f0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
30200 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
30210 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
30220 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
30230 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
30240 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30250 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
30260 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
30270 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
30280 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
30290 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
302a0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
302b0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
302c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
302d0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
302e0 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
302f0 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
30300 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
30310 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
30320 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
30330 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30340 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
30350 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
30360 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
30370 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
30380 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
30390 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
303a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
303b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
303c0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
303d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
303e0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
303f0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
30400 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
30410 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
30420 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
30430 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
30440 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
30450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30460 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
30470 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
30480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30490 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
304a0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
304b0 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
304c0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
304d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
304e0 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
304f0 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
30500 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
30510 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
30520 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
30530 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
30540 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
30550 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
30560 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
30570 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
30580 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
30590 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
305a0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
305b0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
305c0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
305d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
305e0 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
305f0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
30600 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
30610 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
30620 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
30630 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
30640 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
30650 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
30660 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
30670 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
30680 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
30690 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
306a0 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
306b0 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
306c0 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
306d0 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
306e0 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
306f0 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
30700 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
30710 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
30720 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
30730 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65  r->nHit);.    re
30740 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30760 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
30770 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
30780 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
30790 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
307a0 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
307b0 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 50  ized.  */..    P
307c0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
307d0 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50  ->nMiss);.    pP
307e0 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20  g = *ppPage;.   
307f0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
30800 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
30810 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
30820 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
30830 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
30840 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
30850 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
30860 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
30870 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
30880 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
30890 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
308a0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
308b0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
308c0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
308d0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
308e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
308f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30900 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
30910 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
30920 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
30930 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
30940 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
30950 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
30960 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
30970 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
30980 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
30990 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
309a0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
309b0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
309c0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
309d0 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
309e0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
309f0 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
30a00 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
30a10 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
30a20 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
30a30 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
30a40 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
30a50 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
30a60 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
30a70 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
30a80 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
30a90 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
30aa0 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
30ab0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
30ac0 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
30ad0 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
30ae0 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
30af0 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
30b00 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
30b10 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
30b20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
30b30 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
30b40 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
30b50 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
30b60 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
30b70 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
30b80 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
30b90 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
30ba0 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
30bb0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
30bc0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
30bd0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
30be0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
30bf0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
30c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
30c10 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
30c20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
30c30 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
30c40 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
30c50 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
30c60 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
30c70 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
30c80 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
30c90 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
30ca0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
30cb0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
30cc0 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
30cd0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
30ce0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
30cf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
30d00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
30d10 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
30d20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  );.      rc = re
30d30 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
30d40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30d60 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
30d70 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
30d80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
30d90 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
30da0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
30db0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
30dc0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
30dd0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
30de0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
30df0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
30e00 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
30e10 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
30e20 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
30e30 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
30e40 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
30e50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
30e60 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
30e70 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
30e80 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
30e90 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
30ea0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
30eb0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
30ec0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
30ed0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
30ee0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
30ef0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
30f00 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
30f10 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
30f20 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
30f30 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
30f40 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
30f50 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
30f60 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
30f70 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
30f80 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
30f90 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
30fa0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
30fb0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
30fc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
30fd0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
30fe0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
30ff0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
31000 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
31010 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
31020 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
31030 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
31040 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
31050 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
31060 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
31070 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
31080 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
31090 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
310a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
310b0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
310c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
310d0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
310e0 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
310f0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
31100 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  RROR );.  sqlite
31110 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
31120 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
31130 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
31140 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
31150 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
31160 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
31170 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
31180 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
31190 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
311a0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
311b0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
311c0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
311d0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
311e0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
311f0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
31200 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
31210 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
31220 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
31230 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
31240 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
31250 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
31260 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
31270 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
31280 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
31290 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
312a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
312b0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
312c0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
312d0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
312e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
312f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31300 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
31310 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
31320 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
31330 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
31340 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
31350 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
31360 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31370 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
31380 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
31390 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
313a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
313b0 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
313c0 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
313d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
313e0 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
313f0 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
31400 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
31410 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
31420 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
31430 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
31440 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
31450 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
31460 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
31470 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
31480 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
31490 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
314a0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
314b0 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
314c0 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
314d0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
314e0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
314f0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
31500 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
31510 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
31520 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
31530 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
31540 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
31550 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
31560 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
31570 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
31580 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
31590 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
315a0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
315b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
315c0 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
315d0 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
315e0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
315f0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
31600 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
31610 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
31620 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
31630 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
31640 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
31650 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
31660 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
31670 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
31680 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
31690 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
316a0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
316b0 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
316c0 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
316d0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
316e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
316f0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
31700 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
31710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31720 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
31730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
31740 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
31750 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
31760 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
31770 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
31780 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
31790 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
317a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
317b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
317c0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
317d0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
317e0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
317f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31800 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
31810 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
31820 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
31830 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
31840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
31850 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
31860 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
31870 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
31880 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
31890 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
318a0 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
318b0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
318c0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
318d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
318e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
318f0 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
31900 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
31910 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
31920 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
31930 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
31940 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
31950 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
31960 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
31970 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
31980 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
31990 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
319a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
319b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
319c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
319d0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
319e0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
319f0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
31a00 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
31a10 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31a20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
31a30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
31a40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31a50 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
31a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
31a70 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
31a80 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
31aa0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
31ad0 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
31ae0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
31af0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
31b00 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
31b10 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
31b20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
31b30 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
31b40 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
31b50 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
31b60 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
31b70 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
31b80 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
31b90 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
31ba0 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  AL).          );
31bb0 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
31bc0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
31bd0 52 49 54 45 0a 20 20 20 20 20 20 20 20 72 63 20  RITE.        rc 
31be0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
31bf0 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
31c00 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
31c10 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31c20 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
31c30 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
31c40 67 65 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ger).        );.
31c50 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20    #else.        
31c60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
31c70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
31c80 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
31c90 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
31ca0 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
31cb0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
31cc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31cd0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
31ce0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
31cf0 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
31d00 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
31d10 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
31d20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31d30 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
31d40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
31d50 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
31d60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
31d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31d80 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
31d90 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
31da0 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
31db0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
31dc0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
31dd0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
31de0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
31df0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
31e00 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
31e10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
31e20 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
31e30 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
31e40 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
31e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
31e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31e70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
31e80 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
31e90 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
31ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
31eb0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
31ec0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
31ed0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31ee0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
31ef0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
31f00 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
31f10 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
31f20 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
31f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31f40 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
31f50 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
31f60 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
31f70 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
31f80 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
31f90 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
31fa0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
31fb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
31fc0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
31fd0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
31fe0 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
31ff0 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
32000 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
32010 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
32020 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
32030 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
32040 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
32050 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
32060 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
32070 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
32080 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
32090 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
320a0 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
320b0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
320c0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
320d0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
320e0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
320f0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
32100 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
32110 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
32120 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
32130 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
32140 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
32150 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
32160 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
32170 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
32180 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
32190 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
321a0 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
321b0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
321c0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
321d0 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
321e0 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
321f0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
32200 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
32210 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
32220 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
32230 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
32240 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
32250 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
32260 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
32270 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
32280 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
32290 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
322a0 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
322b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
322c0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
322d0 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
322e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
322f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
32300 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
32310 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
32320 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
32330 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
32340 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
32350 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
32360 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65  ERROR );.  pPage
32370 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
32380 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
32390 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  ry;..  if( ALWAY
323a0 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  S(pPager->eState
323b0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20  ==PAGER_READER) 
323c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
323d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
323e0 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  l==0 );..    if(
323f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32400 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
32410 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
32420 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
32430 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
32440 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
32450 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
32460 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
32470 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
32480 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
32490 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
324a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
324b0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
324c0 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
324d0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
324e0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
324f0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
32500 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
32510 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
32520 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
32530 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32540 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32550 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
32560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
32570 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
32580 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
32590 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
325a0 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
325b0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
325c0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
325d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
325e0 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
325f0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
32600 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
32610 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
32620 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
32630 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
32640 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
32650 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
32660 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
32670 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
32680 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
32690 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
326a0 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
326b0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
326c0 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
326d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
326e0 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
326f0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32700 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
32710 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
32720 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
32730 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32740 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
32750 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
32760 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
32770 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
32780 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
32790 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
327a0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
327b0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
327c0 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
327d0 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
327e0 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
327f0 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
32800 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
32810 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
32820 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
32830 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32840 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
32850 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
32860 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
32870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32880 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
32890 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
328a0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
328b0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
328c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
328d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
328e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
328f0 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
32900 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
32910 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
32920 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
32930 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
32940 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
32950 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
32960 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
32970 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
32980 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
32990 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
329a0 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
329b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
329c0 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
329d0 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
329e0 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
329f0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
32a00 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
32a10 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
32a20 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
32a30 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
32a40 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
32a50 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
32a60 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
32a70 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
32a80 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
32a90 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
32aa0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
32ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
32ac0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
32ad0 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
32ae0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
32af0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
32b00 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
32b10 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
32b20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
32b30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
32b40 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
32b50 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
32b60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32b70 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
32b80 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
32b90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
32ba0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32bb0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
32bc0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
32bd0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
32be0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32bf0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
32c10 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
32c20 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
32c30 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
32c40 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
32c50 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
32c60 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
32c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
32c80 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61  a single data pa
32c90 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
32ca0 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
32cb0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
32cc0 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f  * main journal o
32cd0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73  r sub-journal as
32ce0 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68   required. If th
32cf0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
32d00 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66  n into.** one of
32d10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   the journals, t
32d20 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
32d30 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
32d40 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  he .** Pager.pIn
32d50 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61  Journal bitvec a
32d60 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
32d70 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
32d80 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66  nt bitvecs.** of
32d90 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f   any open savepo
32da0 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69  ints as appropri
32db0 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
32dc0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
32dd0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
32de0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
32df0 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
32e00 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
32e10 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
32e20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
32e30 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
32e40 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
32e50 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61  less a write-tra
32e60 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
32e70 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20  eady .  ** been 
32e80 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75  started. The jou
32e90 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72  rnal file may or
32ea0 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
32eb0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
32ec0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72    ** It is never
32ed0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45   called in the E
32ee0 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f  RROR state..  */
32ef0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
32f00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32f10 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
32f20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
32f30 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
32f40 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
32f50 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
32f60 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
32f70 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
32f80 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
32f90 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
32fa0 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  ager) );..  /* I
32fb0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62  f an error has b
32fc0 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64  een previously d
32fd0 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20  etected, report 
32fe0 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20  the same error. 
32ff0 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20   ** again. This 
33000 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65  should not happe
33010 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65 63 6b  n, but the check
33020 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74   provides robust
33030 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
33040 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
33050 43 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20  Code) )  return 
33060 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
33070 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65  ..  /* Higher-le
33080 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76  vel routines nev
33090 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  er call this fun
330a0 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73  ction if databas
330b0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72  e is not.  ** wr
330c0 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65  itable.  But che
330d0 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20  ck anyway, just 
330e0 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  for robustness. 
330f0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
33100 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29  Pager->readOnly)
33110 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
33120 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f  _PERM;..  CHECK_
33130 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
33140 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
33150 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70  e needs to be op
33160 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76  ened. Higher lev
33170 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  el routines have
33180 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62   already.  ** ob
33190 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73  tained the neces
331a0 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65  sary locks to be
331b0 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72  gin the write-tr
331c0 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74  ansaction, but t
331d0 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  he.  ** rollback
331e0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
331f0 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20  ot yet be open. 
33200 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74  Open it now if t
33210 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
33220 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
33230 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63  is done before c
33240 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
33250 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20  acheMakeDirty() 
33260 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20  on the page. .  
33270 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
33280 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66   it were done af
33290 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  ter calling sqli
332a0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
332b0 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ty(), then.  ** 
332c0 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f  an error might o
332d0 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67  ccur and the pag
332e0 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20  er would end up 
332f0 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  in WRITER_LOCKED
33300 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68   state.  ** with
33310 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73   pages marked as
33320 20 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61   dirty in the ca
33330 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
33340 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33350 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
33360 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  KED ){.    rc = 
33370 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
33380 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
33390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
333a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
333b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
333c0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
333d0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
333e0 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
333f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
33400 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
33410 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
33420 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
33430 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
33440 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
33450 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
33460 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
33470 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
33480 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  way..  */.  sqli
33490 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
334a0 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
334b0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
334c0 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72  ) && !subjRequir
334d0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
334e0 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
334f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
33500 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
33510 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
33520 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
33530 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
33540 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
33550 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
33560 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
33570 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
33580 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
33590 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
335a0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
335b0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
335c0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
335d0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
335e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67   */.    if( !pag
335f0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
33600 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
33610 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33620 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
33630 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
33640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
33650 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
33660 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73  dbOrigSize && is
33670 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
33680 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  ) ){.        u32
33690 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
336a0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
336b0 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d        i64 iOff =
336c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
336d0 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  Off;..        /*
336e0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
336f0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
33700 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
33710 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
33720 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
33730 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
33740 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
33750 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
33760 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
33770 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
33780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
33790 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
337a0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
337b0 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
337c0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
337d0 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a  alHdr<=pPager->j
337e0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
337f0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
33800 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
33810 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
33820 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
33830 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
33840 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
33850 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
33860 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20  pData2);..      
33870 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
33880 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
33890 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
338a0 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
338b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
338c0 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
338d0 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
338e0 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
338f0 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20   the page..     
33900 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
33910 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
33920 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
33930 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
33940 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c  in.        ** pl
33950 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
33960 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
33970 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
33980 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
33990 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
339a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
339b0 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72   And if an IO er
339c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
339d0 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20   doing so,.     
339e0 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75     ** then corru
339f0 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77  ption may follow
33a00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
33a10 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
33a20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
33a30 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  NC;..        rc 
33a40 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
33a50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
33a60 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
33a70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33a80 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
33a90 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
33aa0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
33ab0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
33ac0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
33ad0 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
33ae0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33af0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
33b00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
33b10 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
33b20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
33b30 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f+pPager->pageSi
33b40 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  ze+4, cksum);.  
33b50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33b60 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
33b70 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f   rc;..        IO
33b80 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
33b90 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
33ba0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
33bb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
33bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
33bd0 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
33be0 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
33bf0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
33c00 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
33c10 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
33c20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
33c30 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
33c40 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
33c50 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
33c60 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
33c70 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
33c80 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
33c90 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
33ca0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
33cb0 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
33cc0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
33cd0 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
33ce0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
33cf0 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  8 + pPager->page
33d00 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50  Size;.        pP
33d10 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
33d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
33d30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
33d40 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
33d50 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
33d60 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
33d70 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
33d80 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
33d90 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
33da0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
33db0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
33dc0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
33dd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
33de0 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
33df0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
33e00 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
33e10 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
33e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33e30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
33e40 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
33e50 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
33e60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
33e90 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
33ea0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
33eb0 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20  DBMOD ){.       
33ec0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
33ed0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
33ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33ef0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
33f00 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
33f10 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
33f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
33f30 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
33f40 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
33f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
33f60 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
33f70 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
33f80 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
33f90 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
33fa0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
33fb0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
33fc0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33fd0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
33fe0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
33ff0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
34000 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
34010 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
34020 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
34030 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
34040 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
34050 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
34060 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
34070 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
34080 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
34090 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
340a0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
340b0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
340c0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
340d0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
340e0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
340f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
34100 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
34110 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
34120 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
34130 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
34140 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
34150 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
34160 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
34170 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34180 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
34190 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
341a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
341b0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
341c0 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68  re .** making ch
341d0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
341e0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
341f0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
34200 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74  n value .** of t
34210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
34220 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
34230 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  to change any pa
34240 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a  ge data unless .
34250 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
34260 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
34270 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  K..**.** The dif
34280 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
34290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
342a0 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
342b0 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
342c0 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
342d0 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
342e0 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
342f0 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
34300 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
34310 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
34320 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
34330 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
34340 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
34350 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
34360 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
34370 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
34380 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
34390 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
343a0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
343b0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
343c0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20   returned.** as 
343d0 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68  appropriate. Oth
343e0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
343f0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
34400 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
34410 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
34420 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34430 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
34440 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
34450 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
34460 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
34470 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
34480 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
34490 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
344a0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73  pageSize);..  as
344b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
344c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
344d0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
344e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
344f0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
34500 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
34510 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
34520 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
34530 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
34540 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
34550 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
34560 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
34570 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34580 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
34590 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
345a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
345b0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
345c0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
345d0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
345e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
345f0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
34600 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
34610 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
34620 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
34630 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
34640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34650 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
34660 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
34670 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
34680 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
34690 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
346a0 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
346b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
346c0 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67  otSyncSpill flag
346d0 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
346e0 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
346f0 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20   allow.    ** a 
34700 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
34710 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
34720 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
34730 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20  ournaled by.    
34740 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
34750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
34760 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
34770 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34780 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
34790 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l==0 );.    pPag
347a0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
347b0 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ll++;..    /* Th
347c0 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
347d0 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
347e0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
347f0 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
34800 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
34810 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
34820 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
34830 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
34840 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
34850 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
34860 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
34870 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
34880 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
34890 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
348a0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
348b0 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
348c0 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72  geCount = pPager
348d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66  ->dbSize;.    if
348e0 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
348f0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
34900 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
34910 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
34920 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
34930 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
34940 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
34950 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
34960 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
34970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34980 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
34990 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
349a0 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
349b0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
349c0 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
349d0 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
349e0 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
349f0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
34a00 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
34a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
34a20 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
34a30 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
34a40 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
34a50 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
34a60 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
34a70 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
34a80 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
34a90 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
34aa0 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
34ab0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
34ad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34ae0 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
34af0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
34b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34b10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
34b20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
34b30 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
34b40 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
34b50 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34b60 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
34b70 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
34b80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
34b90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
34ba0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34bb0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
34bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
34bd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34be0 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
34bf0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
34c00 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
34c10 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
34c20 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
34c30 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
34c40 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
34c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
34c60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34c70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
34c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
34c90 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
34ca0 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
34cb0 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
34cc0 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
34cd0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
34ce0 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
34cf0 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
34d00 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
34d10 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
34d20 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
34d30 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
34d40 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
34d50 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
34d60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
34d70 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
34d80 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
34d90 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
34da0 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
34db0 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
34dc0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
34dd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
34de0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
34df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
34e00 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
34e10 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
34e20 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   );.      for(ii
34e30 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69  =0; ii<nPage; ii
34e40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
34e50 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
34e60 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
34e70 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
34e80 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
34e90 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
34ea0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
34eb0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
34ec0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34ed0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
34ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34ef0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
34f00 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
34f10 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a  SyncSpill==1 );.
34f20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
34f30 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20  tSyncSpill--;.  
34f40 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
34f50 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
34f60 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
34f70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
34f80 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
34f90 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
34fa0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
34fb0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
34fc0 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
34fd0 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
34fe0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
34ff0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
35000 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
35010 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
35020 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
35030 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
35040 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35050 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
35060 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
35070 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
35080 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
35090 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
350a0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
350b0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
350c0 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
350d0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
350e0 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
350f0 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
35100 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
35110 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
35120 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
35130 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
35140 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
35150 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
35160 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
35170 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
35180 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
35190 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
351a0 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
351b0 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
351c0 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
351d0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
351e0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
351f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
35200 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
35210 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
35220 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
35230 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
35240 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
35250 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
35260 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
35270 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
35280 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
35290 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
352a0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
352b0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
352c0 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
352d0 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
352e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
352f0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
35300 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
35310 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
35320 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
35330 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
35340 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
35350 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
35360 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
35370 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
35380 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
35390 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
353a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
353b0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
353c0 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
353d0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
353e0 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
353f0 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
35400 57 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72  WRITE;.    pager
35410 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
35420 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
35430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
35440 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
35450 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
35460 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
35470 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
35480 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
35490 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
354a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
354b0 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
354c0 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
354d0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
354e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44  **.** If the isD
354f0 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69  irectMode flag i
35500 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
35510 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c  s is done by cal
35520 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
35530 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
35540 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64  page 1, then mod
35550 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
35560 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  nts of the.** pa
35570 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73  ge data. In this
35580 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77   case the file w
35590 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77  ill be updated w
355a0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
355b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
355c0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
355d0 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d  ** The isDirectM
355e0 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c  ode flag may onl
355f0 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  y be non-zero if
35600 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73   the library was
35610 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74   compiled.** wit
35620 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
35630 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
35640 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
35650 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a  In this case,.**
35660 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20   if isDirect is 
35670 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
35680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35690 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65   is updated dire
356a0 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69  ctly.** by writi
356b0 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65  ng an updated ve
356c0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
356d0 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
356e0 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  the .** sqlite3O
356f0 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  sWrite() functio
35700 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
35710 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
35720 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
35730 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
35740 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e  irectMode){.  in
35750 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35760 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
35770 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35780 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
35790 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
357a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
357b0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
357c0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
357d0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
357e0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
357f0 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69  /* Declare and i
35800 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61  nitialize consta
35810 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69  nt integer 'isDi
35820 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20  rect'. If the.  
35830 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  ** atomic-write 
35840 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
35850 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  enabled in this 
35860 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69  build, then isDi
35870 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69  rect.  ** is ini
35880 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
35890 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
358a0 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
358b0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20   parameter.  ** 
358c0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
358d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
358e0 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
358f0 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
35900 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
35910 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  t if the atomic-
35920 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
35930 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65  on is not.  ** e
35940 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
35950 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70  e time, the comp
35960 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68  iler can omit th
35970 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20  e tests of.  ** 
35980 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77  'isDirect' below
35990 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  , as well as the
359a0 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20   block enclosed 
359b0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28  in the.  ** "if(
359c0 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e   isDirect )" con
359d0 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  dition..  */.#if
359e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
359f0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
35a00 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
35a10 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28  MODE 0.  assert(
35a20 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
35a30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
35a40 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
35a50 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  ode);.#else.# de
35a60 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
35a70 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65   isDirectMode.#e
35a80 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61  ndif..  if( !pPa
35a90 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
35aa0 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Done && pPager->
35ab0 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
35ac0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20  PgHdr *pPgHdr;  
35ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35ae0 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   Reference to pa
35af0 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20  ge 1 */.    u32 
35b00 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20  change_counter; 
35b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
35b20 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68  tial value of ch
35b30 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
35b40 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ld */..    asser
35b50 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
35b60 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70  File && isOpen(p
35b70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
35b80 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
35b90 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
35ba0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
35bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35bc0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
35bd0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
35be0 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d  assert( pPgHdr==
35bf0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
35c00 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  OK );..    /* If
35c10 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65   page one was fe
35c20 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c  tched successful
35c30 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ly, and this fun
35c40 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20  ction is not.   
35c50 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   ** operating in
35c60 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61   direct-mode, ma
35c70 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62  ke page 1 writab
35c80 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e  le.  When not in
35c90 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20   .    ** direct 
35ca0 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20  mode, page 1 is 
35cb0 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63  always held in c
35cc0 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74  ache and hence t
35cd0 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20  he PagerGet().  
35ce0 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c    ** above is al
35cf0 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20  ways successful 
35d00 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41  - hence the ALWA
35d10 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45  YS on rc==SQLITE
35d20 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _OK..    */.    
35d30 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45  if( !DIRECT_MODE
35d40 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53   && ALWAYS(rc==S
35d50 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20  QLITE_OK) ){.   
35d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35d70 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
35d80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
35d90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35da0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  ){.      /* Incr
35db0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
35dc0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
35dd0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
35de0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20  yte 24. */.     
35df0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
35e00 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
35e10 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
35e20 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
35e30 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
35e40 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  ++;.      put32b
35e50 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
35e60 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
35e70 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
35e80 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73  .      /* Also s
35e90 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
35ea0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
35eb0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
35ec0 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  nd in.      ** b
35ed0 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
35ee0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
35ef0 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
35f00 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
35f10 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61  r.      ** is va
35f20 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75  lid. */.      pu
35f30 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
35f40 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39  pPgHdr->pData)+9
35f50 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  2, change_counte
35f60 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  r);.      put32b
35f70 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
35f80 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  dr->pData)+96, S
35f90 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
35fa0 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  MBER);..      /*
35fb0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64   If running in d
35fc0 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74  irect mode, writ
35fd0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
35fe0 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20  f page 1 to the 
35ff0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
36000 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29  f( DIRECT_MODE )
36010 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
36020 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20  void *zBuf;.    
36030 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36040 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30  er->dbFileSize>0
36050 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
36060 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64  C2(pPager, pPgHd
36070 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20  r->pData, 1, 6, 
36080 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
36090 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20   zBuf);.        
360a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
360b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
360c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
360d0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
360e0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
360f0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
36100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
36110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36120 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
36130 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
36140 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
36150 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
36160 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
36170 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
36180 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
36190 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
361a0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
361b0 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
361c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
361d0 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  pPgHdr);.  }.  r
361e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
361f0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
36200 62 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69 73  base file to dis
36210 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  k. This is a no-
36220 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  op for in-memory
36230 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f 72   databases.** or
36240 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20   pages with the 
36250 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
36260 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  g set..**.** If 
36270 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
36280 66 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  f called on a pa
36290 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74  ger for which it
362a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69   is a no-op, thi
362b0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
362c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
362d0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49   Otherwise, an I
362e0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
362f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
36300 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
36310 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
36320 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
36330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36340 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
36350 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
36360 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
36370 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
36380 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
36390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
363a0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
363b0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
363c0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
363d0 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  yncFlags);.  }. 
363e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
363f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
36400 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
36410 61 6c 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72  alled while a wr
36420 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
36430 69 73 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20  is active in.** 
36440 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65  rollback. If the
36450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
36460 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73  n WAL mode, this
36470 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
36480 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
36490 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
364a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  on does not alre
364b0 61 64 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c  ady have an EXCL
364c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a  USIVE lock on .*
364d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
364e0 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ile, an attempt 
364f0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
36500 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n one..**.** If 
36510 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
36520 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
36530 6c 64 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70  ld or the attemp
36540 74 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69  t to obtain it i
36550 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c  s.** successful,
36560 20 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   or the connecti
36570 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64  on is in WAL mod
36580 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
36590 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
365a0 65 72 77 69 73 65 2c 20 65 69 74 68 65 72 20 53  erwise, either S
365b0 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e  QLITE_BUSY or an
365c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
365d0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
365e0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
365f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36600 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50  rExclusiveLock(P
36610 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
36620 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36630 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
36640 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36650 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
36660 45 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  EMOD .       || 
36670 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36680 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
36690 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
366a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
366b0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
366c0 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
366d0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
366e0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
366f0 20 20 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73    if( 0==pagerUs
36700 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
36710 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
36720 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
36730 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36740 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  CK);.  }.  retur
36750 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
36760 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
36770 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
36780 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
36790 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
367a0 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
367b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
367c0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
367d0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
367e0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
367f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
36800 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
36810 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
36820 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
36830 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
36840 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
36850 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
36860 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
36870 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
36880 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
36890 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
368a0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73  hange-counter is
368b0 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a   updated,.**   *
368c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
368d0 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74  synced (unless t
368e0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
368f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
36900 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c  used),.**   * al
36910 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72  l dirty pages ar
36920 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
36930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
36940 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
36950 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75  base file is tru
36960 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69  ncated (if requi
36970 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  red), and.**   *
36980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36990 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a  le synced. .**.*
369a0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
369b0 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
369c0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
369d0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69  saction is to fi
369e0 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65  nalize .** (dele
369f0 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20  te, truncate or 
36a00 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70  zero the first p
36a10 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72  art of) the jour
36a20 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a  nal file (or .**
36a30 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
36a40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
36a50 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
36a60 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
36a70 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
36a80 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
36a90 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
36aa0 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
36ab0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
36ac0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
36ad0 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
36ae0 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20  ** If the final 
36af0 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79  parameter - noSy
36b00 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68  nc - is true, th
36b10 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
36b20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69  file itself.** i
36b30 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68  s not synced. Th
36b40 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61  e caller must ca
36b50 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ll sqlite3PagerS
36b60 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74  ync() directly t
36b70 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61  o.** sync the da
36b80 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
36b90 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69  re calling Commi
36ba0 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64  tPhaseTwo() to d
36bb0 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  elete the.** jou
36bc0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69  rnal file in thi
36bd0 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s case..*/.int s
36be0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
36bf0 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67  tPhaseOne(.  Pag
36c00 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
36c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36c20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
36c30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
36c40 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  aster,          
36c50 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
36c60 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
36c70 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
36c80 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20  nt noSync       
36c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36ca0 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74  * True to omit t
36cb0 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20  he xSync on the 
36cc0 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  db file */.){.  
36cd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36ce0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
36cf0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
36d00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
36d10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36d20 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36d30 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36d40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36d50 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
36d60 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
36d70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36d80 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
36d90 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
36da0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
36db0 52 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ROR.  );.  asser
36dc0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36dd0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36de0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f  ..  /* If a prio
36df0 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  r error occurred
36e00 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72  , report that er
36e10 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ror again. */.  
36e20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
36e30 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
36e40 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
36e50 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  ode;..  PAGERTRA
36e60 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59  CE(("DATABASE SY
36e70 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
36e80 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c  ter=%s nSize=%d\
36e90 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
36ea0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
36eb0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  aster, pPager->d
36ec0 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  bSize));..  /* I
36ed0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68  f no database ch
36ee0 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
36ef0 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72  made, return ear
36f00 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ly. */.  if( pPa
36f10 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
36f20 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
36f30 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  D ) return SQLIT
36f40 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  E_OK;..  if( MEM
36f50 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  DB ){.    /* If 
36f60 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
36f70 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
36f80 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
36f90 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
36fa0 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
36fb0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
36fc0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
36fd0 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
36fe0 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
36ff0 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
37000 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
37010 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
37020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
37030 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
37040 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
37050 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
37060 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
37070 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
37080 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
37090 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
370a0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
370b0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 69  PCache);.      i
370c0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
370d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
370e0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
370f0 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64  pList, pPager->d
37100 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20  bSize, 1, .     
37110 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
37120 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67 65  fullSync ? pPage
37130 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3a 20 30  r->syncFlags : 0
37140 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
37150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
37160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
37180 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
37190 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
371a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
371b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
371c0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
371d0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
371e0 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
371f0 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20  tly how it.     
37200 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65   ** does this de
37210 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
37220 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
37230 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
37240 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  zation.      ** 
37250 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
37260 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64  ompile time, and
37270 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   if this transac
37280 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a  tion meets the .
37290 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65        ** runtime
372a0 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
372b0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
372c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
372d0 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
372e0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
372f0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
37300 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
37310 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f       **      blo
37320 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
37330 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
37340 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
37350 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
37360 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
37370 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
37380 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  nd.      **    *
37390 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
373a0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
373b0 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
373c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
373d0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
373e0 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69    ** If the opti
373f0 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74  mization was not
37400 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
37410 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74  ile time, then t
37420 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
37430 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
37440 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
37450 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
37460 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
37470 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20       ** counter 
37480 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64  in 'indirect-mod
37490 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d  e'. If the optim
374a0 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69  ization is compi
374b0 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20  led in but.     
374c0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69   ** is not appli
374d0 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72  cable to this tr
374e0 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20  ansaction, call 
374f0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
37500 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  eate().      ** 
37510 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
37520 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
37530 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
37540 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
37550 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ll.      ** page
37560 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
37570 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
37580 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
37590 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
375a0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a        ** mode. .
375b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
375c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
375d0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
375e0 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64   is both enabled
375f0 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c   and applicable,
37600 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  .      ** then c
37610 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
37620 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
37630 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
37640 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
37650 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27    ** in 'direct'
37660 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
37670 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
37680 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  file will never 
37690 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  be.      ** crea
376a0 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
376b0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
376c0 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  */.  #ifdef SQLI
376d0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
376e0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50 67 48  _WRITE.      PgH
376f0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61  dr *pPg;.      a
37700 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
37710 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
37720 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37730 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
37740 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37750 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
37760 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
37770 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
37780 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
37790 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
377a0 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
377b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
377c0 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  d) .       && pP
377d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
377e0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
377f0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
37800 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
37810 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze>=pPager->dbOr
37820 69 67 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26  igSize.       &&
37830 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
37840 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
37850 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
37860 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
37870 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b  pDirty).      ){
37880 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
37890 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
378a0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
378b0 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
378c0 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
378d0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
378e0 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
378f0 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d  odify the in-mem
37900 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
37910 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20  on of page 1 .  
37920 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c        ** to incl
37930 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20  ude the updated 
37940 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
37950 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
37960 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
37970 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
37980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37990 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
379a0 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20  tomic-write .   
379b0 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
379c0 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
379d0 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
379e0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20  s safe..        
379f0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
37a00 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
37a10 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
37a20 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
37a30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
37a40 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
37a50 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
37a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37a80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
37a90 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
37aa0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
37ab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37ac0 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20     }.  #else.   
37ad0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
37ae0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
37af0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 23  (pPager, 0);.  #
37b00 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
37b10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37b20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
37b30 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
37b40 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
37b50 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
37b60 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
37b70 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
37b80 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
37b90 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
37ba0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
37bb0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
37bc0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
37bd0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
37be0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
37bf0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
37c00 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
37c10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
37c20 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
37c30 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
37c40 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
37c50 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 20   than the .     
37c60 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
37c70 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
37c80 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
37c90 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
37ca0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74        ** that it
37cb0 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
37cc0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
37cd0 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
37ce0 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  , the.      ** c
37cf0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
37d00 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e  agerGet() return
37d10 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e   zeroed pages in
37d20 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20 20  stead of .      
37d30 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20  ** reading data 
37d40 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
37d50 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
37d60 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .  #ifndef SQLIT
37d70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37d80 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  M.      if( pPag
37d90 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
37da0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
37db0 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
37dc0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
37dd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37de0 4f 46 46 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  OFF.      ){.   
37df0 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20       Pgno i;    
37e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37e20 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
37e30 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
37e40 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20  onst Pgno iSkip 
37e50 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
37e60 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64  pPager); /* Pend
37e70 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f  ing lock page */
37e80 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
37e90 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61  gno dbSize = pPa
37ea0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20  ger->dbSize;    
37eb0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
37ec0 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20  mage size */ .  
37ed0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
37ee0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
37ef0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20  bOrigSize;.     
37f00 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65     for( i=dbSize
37f10 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64  +1; i<=pPager->d
37f20 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29  bOrigSize; i++ )
37f30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
37f40 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
37f50 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
37f60 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d  urnal, i) && i!=
37f70 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
37f80 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
37f90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
37fa0 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
37fb0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  l */.           
37fc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37fd0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
37fe0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
37ff0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
38000 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
38010 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
38020 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
38030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
38040 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
38050 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
38060 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
38070 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
38080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
38090 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
380a0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
380b0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
380c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
380d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
380e0 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  = dbSize;.      
380f0 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20  } .  #endif.  . 
38100 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
38110 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
38120 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
38130 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
38140 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20  a master .      
38150 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
38160 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
38170 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
38180 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
38190 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  e, .      ** or 
381a0 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55  if zMaster is NU
381b0 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  LL (no master jo
381c0 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69  urnal), then thi
381d0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
381e0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
381f0 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
38200 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
38210 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
38220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38230 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
38240 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
38250 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79  ;.  .      /* Sy
38260 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
38270 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20 61 6c  ile and write al
38280 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
38290 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
382a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61       ** If the a
382b0 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
382c0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
382d0 6e 67 20 75 73 65 64 2c 20 74 68 69 73 20 73 79  ng used, this sy
382e0 6e 63 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20  nc will not .   
382f0 20 20 20 2a 2a 20 63 72 65 61 74 65 20 74 68 65     ** create the
38300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
38310 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 72 65 61   perform any rea
38320 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  l IO..      **. 
38330 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
38340 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
38350 65 72 20 70 61 67 65 20 77 61 73 20 6a 75 73 74  er page was just
38360 20 6d 6f 64 69 66 69 65 64 2c 20 75 6e 6c 65 73   modified, unles
38370 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  s the.      ** a
38380 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
38390 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
383a0 64 20 69 74 20 69 73 20 61 6c 6d 6f 73 74 20 63  d it is almost c
383b0 65 72 74 61 69 6e 20 74 68 61 74 20 74 68 65 0a  ertain that the.
383c0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
383d0 20 72 65 71 75 69 72 65 73 20 61 20 73 79 6e 63   requires a sync
383e0 20 68 65 72 65 2e 20 48 6f 77 65 76 65 72 2c 20   here. However, 
383f0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
38400 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 20  exclusive.      
38410 2a 2a 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 75  ** on a system u
38420 6e 64 65 72 20 6d 65 6d 6f 72 79 20 70 72 65 73  nder memory pres
38430 73 75 72 65 20 69 74 20 69 73 20 6a 75 73 74 20  sure it is just 
38440 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68  possible that th
38450 69 73 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  is is .      ** 
38460 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 20 49 6e  not the case. In
38470 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
38480 20 6c 69 6b 65 6c 79 20 65 6e 6f 75 67 68 20 74   likely enough t
38490 68 61 74 20 74 68 65 20 72 65 64 75 6e 64 61 6e  hat the redundan
384a0 74 0a 20 20 20 20 20 20 2a 2a 20 78 53 79 6e 63  t.      ** xSync
384b0 28 29 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20  () call will be 
384c0 63 68 61 6e 67 65 64 20 74 6f 20 61 20 6e 6f 2d  changed to a no-
384d0 6f 70 20 62 79 20 74 68 65 20 4f 53 20 61 6e 79  op by the OS any
384e0 68 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  how. .      */. 
384f0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
38500 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29  urnal(pPager, 0)
38510 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
38520 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
38530 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
38540 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
38550 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
38560 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
38570 72 2c 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  r,sqlite3PcacheD
38580 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
38590 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20  >pPCache));.    
385a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
385b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
385c0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
385d0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
385e0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
385f0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
38600 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
38610 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
38620 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
38630 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a  r->pPCache);.  .
38640 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
38650 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
38660 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
38670 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
38680 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a  e image,.      *
38690 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72  * then use pager
386a0 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f  _truncate to gro
386b0 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20  w or shrink the 
386c0 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
386d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
386e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
386f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65