/ Hex Artifact Content
Login

Artifact 4056376f83f85cea9922a11161087c529e39f7dc:


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 20 20 75 38  file I/O */.  u8
7300: 20 72 65 61 64 4f 6e 6c 79 53 68 6d 3b 20 20 20   readOnlyShm;   
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7320: 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 73  e if read-only s
7330: 68 6d 20 61 63 63 65 73 73 20 69 73 20 4f 6b 20  hm access is Ok 
7340: 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  */..  /*********
7350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7390: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
73a0: 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61  wing block conta
73b0: 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20  ins those class 
73c0: 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61  members that cha
73d0: 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  nge during.  ** 
73e0: 72 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e  routine opertion
73f0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
7400: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
7410: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
7420: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
7430: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
7440: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7450: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7460: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7470: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7480: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7490: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
74a0: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
74b0: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
74c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
74d0: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
74e0: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
74f0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
7500: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
7510: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
7520: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
7530: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7540: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7550: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7560: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7570: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
75a0: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
75b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
75c0: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
75f0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
7600: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
7610: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
7620: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
7630: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
7640: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7650: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7660: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7670: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7680: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7690: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
76a0: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
76b0: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
76c0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
76d0: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
76e0: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
76f0: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53  .  u8 doNotSyncS
7700: 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  pill;          /
7710: 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70  * Do not do a sp
7720: 69 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65  ill that require
7730: 73 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20  s jrnl sync */. 
7740: 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79   u8 subjInMemory
7750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7760: 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d  True to use in-m
7770: 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
7780: 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53  ls */.  Pgno dbS
7790: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
77a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
77b0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
77c0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f  tabase */.  Pgno
77d0: 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20   dbOrigSize;    
77e0: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
77f0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
7800: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
7810: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c   */.  Pgno dbFil
7820: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
7830: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
7840: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
7850: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
7860: 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20  gno dbHintSize; 
7870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
7880: 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43  lue passed to FC
7890: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61  NTL_SIZE_HINT ca
78a0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  ll */.  int errC
78b0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
78c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
78d0: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
78e0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
78f0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
7900: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
7910: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
7920: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
7930: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
7940: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
7950: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
7960: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
7970: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
7980: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
7990: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
79a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
79b0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
79c0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
79d0: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
79e0: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
79f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
7a00: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
7a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a20: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a30: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
7a40: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a50: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
7a60: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
7a70: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
7aa0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
7ab0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
7ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7ad0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7ae0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7af0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b10: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
7b20: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
7b30: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
7b40: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
7b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
7b60: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
7b70: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
7b80: 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  der */.  sqlite3
7b90: 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
7ba0: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
7bb0: 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69  to list of ongoi
7bc0: 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ng backup proces
7bd0: 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  ses */.  PagerSa
7be0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
7bf0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
7c00: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
7c10: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
7c20: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
7c30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7c40: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
7c50: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
7c60: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
7c70: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
7c80: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
7c90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
7ca0: 6e 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  nges */.  /*.  *
7cb0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7cc0: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7cd0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
7d30: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7d50: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
7d60: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
7d70: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
7d80: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
7d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7da0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
7db0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
7dc0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
7dd0: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
7de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
7df0: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
7e00: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
7e10: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7e30: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7e40: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
7e50: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
7e60: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
7e70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7e80: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
7e90: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
7ea0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
7eb0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
7ec0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
7ed0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
7ee0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
7ef0: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
7f00: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
7f10: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
7f20: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
7f30: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
7f40: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7f50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7f60: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
7f70: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
7f80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7f90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7fa0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
7fb0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
7fc0: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
7fd0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
7fe0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
7ff0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8000: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8010: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8020: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
8030: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
8040: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
8050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
8060: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
8070: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
8080: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
8090: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
80a0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
80b0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
80c0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
80d0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
80e0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
80f0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8100: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8110: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8120: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8130: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8140: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8150: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8160: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8170: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8180: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8190: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
81a0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
81b0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
81c0: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
81d0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
81e0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
81f0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8200: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8220: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8230: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8240: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8250: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8270: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8280: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8290: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
82a0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
82b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
82c0: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
82d0: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
82e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
82f0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8300: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8310: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8320: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8330: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8340: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8350: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8360: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8370: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8380: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8390: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
83a0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
83b0: 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e  iables hold coun
83c0: 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  ters used for.**
83d0: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
83e0: 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76  s only.  These v
83f0: 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  ariables do not 
8400: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f  exist in.** a no
8410: 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e  n-testing build.
8420: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
8430: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
8440: 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  -safe..*/.#ifdef
8450: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
8460: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
8470: 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  eaddb_count = 0;
8480: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8490: 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64   full pages read
84a0: 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20   from DB */.int 
84b0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
84c0: 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  itedb_count = 0;
84d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
84e0: 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74  full pages writt
84f0: 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20  en to DB */.int 
8500: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8510: 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  itej_count = 0; 
8520: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8530: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8540: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65   journal */.# de
8550: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8560: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
8570: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8580: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
8590: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
85a0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
85b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
85c0: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
85d0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
85e0: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
85f0: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
8600: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
8610: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
8620: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
8630: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
8640: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
8650: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
8660: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
8670: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
8680: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
8690: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
86a0: 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72  l is being.** wr
86b0: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
86c0: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
86d0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
86e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
86f0: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
8700: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
8710: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
8720: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
8730: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
8740: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
8750: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
8760: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
8770: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
8780: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
8790: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
87a0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
87b0: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
87c0: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
87d0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
87e0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
87f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
8800: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
8810: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
8820: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
8830: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
8840: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
8850: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
8860: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
8870: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
8880: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
8890: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
88a0: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
88b0: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
88c0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
88d0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
88e0: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
88f0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
8900: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
8910: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
8920: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
8930: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
8940: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
8950: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
8960: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
8970: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
8980: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
8990: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
89a0: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
89b0: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
89c0: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
89d0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
89e0: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
89f0: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
8a00: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
8a10: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
8a20: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
8a30: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
8a40: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8a50: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
8a60: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
8a70: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
8a80: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
8a90: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
8aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8ab0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
8ac0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
8ad0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
8ae0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
8af0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
8b00: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
8b10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
8b20: 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f  f each page reco
8b30: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
8b40: 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  l is given by.**
8b50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8b60: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
8b70: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
8b80: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
8b90: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
8ba0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
8bb0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
8bc0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
8bd0: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
8be0: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a  the same .** siz
8bf0: 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69  e as a single di
8c00: 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61  sk sector. See a
8c10: 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a  lso setSectorSiz
8c20: 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e()..*/.#define 
8c30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8c40: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
8c50: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
8c60: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
8c70: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
8c80: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
8c90: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
8ca0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
8cb0: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
8cc0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
8cd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
8ce0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
8cf0: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
8d00: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
8d10: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
8d20: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
8d30: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
8d40: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
8d50: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
8d60: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8d70: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8d80: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8d90: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
8da0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
8db0: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
8dc0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
8dd0: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
8de0: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
8df0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8e00: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
8e10: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
8e20: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8e30: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
8e40: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
8e50: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
8e60: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
8e70: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
8e80: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
8e90: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
8ea0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
8eb0: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
8ec0: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
8ed0: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
8ee0: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
8ef0: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
8f00: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
8f10: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
8f20: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
8f30: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
8f40: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
8f50: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
8f60: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
8f70: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
8f80: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
8f90: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
8fa0: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
8fb0: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
8fc0: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
8fd0: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
8fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8ff0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9000: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
9010: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
9020: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
9030: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9040: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9050: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
9060: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
9070: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9080: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
9090: 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e  x,y,z) 0.# defin
90a0: 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  e pagerOpenWalIf
90b0: 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54  Present(z) SQLIT
90c0: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61  E_OK.# define pa
90d0: 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
90e0: 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54  saction(z) SQLIT
90f0: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E_OK.#endif..#if
9100: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
9110: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
9120: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
9130: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
9140: 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  ger) );.**.** Th
9150: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73  is function runs
9160: 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f   many asserts to
9170: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63   try to find inc
9180: 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a  onsistencies in.
9190: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ** the internal 
91a0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67  state of the Pag
91b0: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  er object..*/.st
91c0: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
91d0: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
91e0: 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a  r *p){.  Pager *
91f0: 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f  pPager = p;..  /
9200: 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20  * State must be 
9210: 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65  valid. */.  asse
9220: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50  rt( p->eState==P
9230: 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20  AGER_OPEN.      
9240: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9250: 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20  AGER_READER.    
9260: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9270: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
9280: 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
9290: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
92a0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
92b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
92c0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
92d0: 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
92e0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
92f0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
9300: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9310: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
9320: 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52  ROR.  );..  /* R
9330: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
9340: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20   current state, 
9350: 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e  a temp-file conn
9360: 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65  ection always be
9370: 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66  haves.  ** as if
9380: 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75   it has an exclu
9390: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
93a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
93b0: 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73  It never updates
93c0: 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65  .  ** the change
93d0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20  -counter field, 
93e0: 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  so the changeCou
93f0: 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61  ntDone flag is a
9400: 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  lways set..  */.
9410: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9420: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65  pFile==0 || p->e
9430: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
9440: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9450: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9460: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   || pPager->chan
9470: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a  geCountDone );..
9480: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a    /* If the useJ
9490: 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63  ournal flag is c
94a0: 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61  lear, the journa
94b0: 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22  l-mode must be "
94c0: 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20  OFF". .  ** And 
94d0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  if the journal-m
94e0: 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68  ode is "OFF", th
94f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9500: 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e  ust not be open.
9510: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9520: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9530: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9540: 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a  E_OFF || p->useJ
9550: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
9560: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9570: 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
9580: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73  LMODE_OFF || !is
9590: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a  Open(p->jfd) );.
95a0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
95b0: 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e   MEMDB implies n
95c0: 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e  oSync. And an in
95d0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
95e0: 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69   Since .  ** thi
95f0: 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65  s means an in-me
9600: 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f  mory pager perfo
9610: 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c  rms no IO at all
9620: 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f  , it cannot enco
9630: 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68  unter .  ** eith
9640: 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  er SQLITE_IOERR 
9650: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  or SQLITE_FULL d
9660: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f  uring rollback o
9670: 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69  r while finalizi
9680: 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  ng .  ** a journ
9690: 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75  al file. (althou
96a0: 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  gh the in-memory
96b0: 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65   journal impleme
96c0: 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a  ntation may .  *
96d0: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
96e0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c  IOERR_NOMEM whil
96f0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
9700: 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  le is being writ
9710: 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69  ten). It .  ** i
9720: 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20  s therefore not 
9730: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20  possible for an 
9740: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
9750: 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
9760: 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a  OR .  ** state..
9770: 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
9780: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9790: 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  p->noSync );.   
97a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
97b0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
97c0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
97d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
97e0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
97f0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9800: 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20  MORY .    );.   
9810: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9820: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
9830: 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  && p->eState!=PA
9840: 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
9850: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
9860: 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d  Wal(p)==0 );.  }
9870: 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65  ..  /* If change
9880: 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74  CountDone is set
9890: 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  , a RESERVED loc
98a0: 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
98b0: 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f  t be held.  ** o
98c0: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  n the file..  */
98d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
98e0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
98f0: 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ne==0 || pPager-
9900: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9910: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9920: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e  t( p->eLock!=PEN
9930: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  DING_LOCK );..  
9940: 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74  switch( p->eStat
9950: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
9960: 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20  GER_OPEN:.      
9970: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
9980: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9990: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
99a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
99b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
99c0: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
99d0: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
99e0: 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  e)==0 || pPager-
99f0: 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
9a00: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9a10: 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52  ase PAGER_READER
9a20: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9a30: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9a40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9a50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9a60: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9a70: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
9a80: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  rt( p->eLock>=SH
9a90: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e  ARED_LOCK || p->
9aa0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20  noReadlock );.  
9ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9ac0: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9ad0: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
9ae0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9af0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9b00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9b10: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9b20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9b30: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
9b40: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
9b50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9b60: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9b70: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9b80: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9b90: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9ba0: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9bb0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9bc0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9bd0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9be0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9bf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c00: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9c10: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9c20: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
9c40: 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Master==0 );.   
9c50: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9c60: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
9c70: 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20  _CACHEMOD:.     
9c80: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9c90: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9ca0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9cb0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9cc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9cd0: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9ce0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9cf0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69  .        /* It i
9d00: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
9d10: 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
9d20: 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65  wal here that ne
9d30: 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20  ither the.      
9d40: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9d50: 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69  e nor the WAL fi
9d60: 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69  le are open. Thi
9d70: 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67  s happens during
9d80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f  .        ** a ro
9d90: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
9da0: 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73  on that switches
9db0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
9dc0: 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a  de=off.        *
9dd0: 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  * to journal_mod
9de0: 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  e=wal..        *
9df0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9e00: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
9e10: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
9e20: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
9e30: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
9e40: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9e50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9e60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9e70: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
9e80: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9e90: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9ea0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
9eb0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
9ec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9ed0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9ee0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
9ef0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
9f00: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9f10: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9f20: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
9f30: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9f40: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9f50: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
9f60: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
9f70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9f80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f90: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9fa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9fb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
9fc0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
9fd0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
9fe0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
9ff0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a000: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a010: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a020: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a030: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a040: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a050: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a060: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a070: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a080: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a090: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a0a0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a0b0: 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  <=pPager->dbHint
a0c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a0d0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a0e0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a0f0: 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  SHED:.      asse
a100: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a110: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a120: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a130: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a140: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a150: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a160: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a170: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a180: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a190: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a1a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a1b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a1c0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a1d0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a1e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a1f0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a200: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a210: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a220: 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20  ERROR:.      /* 
a230: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  There must be at
a240: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
a250: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a260: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66   to the pager if
a270: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52  .      ** in ERR
a280: 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
a290: 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68  ise the pager sh
a2a0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
a2b0: 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20  y dropped.      
a2c0: 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  ** back to OPEN 
a2d0: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
a2e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a2f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
a300: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a320: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a330: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a340: 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >0 );.      brea
a350: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a360: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a370: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
a380: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a390: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
a3a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a3b0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
a3c0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
a3d0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
a3e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
a3f0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
a400: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a410: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
a420: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
a430: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
a440: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
a450: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
a460: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
a470: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
a480: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
a490: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
a4a0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
a4b0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
a4c0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a4d0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a4e0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
a4f0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
a500: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
a510: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
a520: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
a530: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
a540: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
a550: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
a560: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
a570: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
a580: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
a590: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
a5a0: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
a5b0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
a5c0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
a5d0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
a5e0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
a5f0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
a600: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
a610: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
a620: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
a630: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
a640: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
a650: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
a660: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
a670: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
a680: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
a690: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
a6a0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
a6b0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
a6c0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
a6d0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
a6e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
a6f0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
a700: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
a710: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a720: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
a730: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
a740: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
a750: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a760: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a770: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
a780: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a790: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a7a0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
a7b0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
a7c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a7d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a7e0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
a7f0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
a800: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a810: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
a820: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
a830: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
a840: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
a850: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
a860: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
a870: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
a880: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
a890: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
a8a0: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
a8b0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
a8c0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
a8d0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
a8e0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
a8f0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
a900: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
a910: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
a920: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
a930: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
a940: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
a950: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
a960: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
a970: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
a980: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
a990: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a9a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a9b0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
a9c0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
a9d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a9e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a9f0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
aa00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
aa10: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aa20: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
aa30: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
aa40: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
aa50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aa60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
aa70: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
aa80: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
aa90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aaa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
aab0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
aac0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
aad0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aae0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aaf0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
ab00: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
ab10: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
ab20: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
ab30: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
ab40: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
ab50: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
ab60: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
ab70: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
ab80: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
ab90: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
aba0: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
abb0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
abc0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
abd0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
abe0: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
abf0: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
ac00: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
ac10: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ac20: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
ac30: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ac40: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ac50: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ac60: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
ac70: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
ac80: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
ac90: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
aca0: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
acb0: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
acc0: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
acd0: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
ace0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
acf0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
ad00: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
ad10: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
ad20: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
ad30: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
ad40: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
ad50: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
ad60: 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  ){.  Pgno pgno =
ad70: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61   pPg->pgno;.  Pa
ad80: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ad90: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
ada0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
adb0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
adc0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  int; i++){.    P
add0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
ade0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
adf0: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
ae00: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
ae10: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
ae20: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
ae30: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
ae40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ae50: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
ae60: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ae70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
ae80: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
ae90: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
aea0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
aeb0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
aec0: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
aed0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
aee0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
aef0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
af00: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
af10: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
af20: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
af30: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
af40: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
af50: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
af60: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
af70: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
af80: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
af90: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
afa0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
afb0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
afc0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
afd0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
afe0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
aff0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b000: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b010: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b020: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b030: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b040: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b050: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b060: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b070: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b080: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b090: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b0a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b0b0: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b0c0: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b0d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b0e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b0f0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b100: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b110: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b120: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b130: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b140: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b150: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b160: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b170: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b180: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b190: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b1a0: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b1b0: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b1c0: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b1d0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b1e0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b1f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b200: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b210: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b220: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b230: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b240: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b250: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b260: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b270: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b290: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b2a0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b2b0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b2c0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b2d0: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b2e0: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b2f0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b300: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b310: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b320: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b330: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b340: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b350: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b360: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b370: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b380: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b390: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b3a0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b3b0: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b3c0: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b3d0: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b3e0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b3f0: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b400: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b410: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b420: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b430: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b440: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b450: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b460: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b470: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b480: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b490: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b4a0: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b4b0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b4c0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b4d0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b4e0: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b4f0: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b500: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b510: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b520: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b530: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b540: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b550: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b560: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b570: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b580: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b590: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b5a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b5b0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b5c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b5d0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
b5e0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
b5f0: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
b600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b610: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
b620: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b630: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b640: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
b650: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
b660: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
b670: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
b680: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
b690: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
b6a0: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
b6b0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
b6c0: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b6d0: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
b6e0: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b6f0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b700: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b710: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b720: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
b730: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
b740: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
b750: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
b760: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
b770: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b780: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b790: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
b7a0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b7b0: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
b7c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b7d0: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
b7e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b7f0: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
b800: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
b810: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
b820: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
b830: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
b840: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
b850: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
b860: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b870: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
b880: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
b890: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
b8a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
b8b0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
b8c0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
b8d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b8e0: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
b8f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
b900: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
b910: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
b920: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
b930: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
b940: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
b950: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
b960: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
b970: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b980: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b990: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
b9a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b9b0: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
b9c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
b9d0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
b9e0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
b9f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
ba00: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
ba10: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
ba20: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
ba30: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
ba40: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
ba50: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
ba60: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
ba70: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
ba80: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
ba90: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
baa0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bab0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bac0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bad0: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bae0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
baf0: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bb00: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bb10: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bb20: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bb30: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bb40: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bb50: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bb60: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bb70: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bb80: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bb90: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bba0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bbb0: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bbc0: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
bbd0: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
bbe0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bbf0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
bc00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bc10: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
bc20: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
bc30: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
bc40: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
bc50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bc60: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
bc70: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
bc80: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
bc90: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bca0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bcb0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
bcc0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
bcd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bcf0: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
bd00: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
bd10: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd30: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
bd40: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
bd70: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
bd80: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
bd90: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
bda0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
bdb0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
bdc0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
bdd0: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
bde0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
bdf0: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
be00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
be10: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
be20: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
be30: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
be40: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
be50: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
be60: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
be70: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
be80: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
be90: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
bea0: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
beb0: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
bec0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
bed0: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
bee0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bef0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
bf00: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
bf10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
bf20: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
bf30: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
bf40: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
bf50: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
bf60: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
bf70: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
bf80: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
bf90: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
bfa0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
bfb0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
bfc0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
bfd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
bfe0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
bff0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c000: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c010: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c020: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c030: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c040: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c050: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c060: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c070: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c080: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c090: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c0a0: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c0b0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c0c0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c0d0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c0e0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c0f0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c100: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c110: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c120: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c130: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c140: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c150: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c160: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c170: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c180: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c190: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c1a0: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c1b0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c1c0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c1d0: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c1e0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c1f0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c200: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c210: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c220: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c230: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c240: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c250: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c260: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c270: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c280: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c290: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c2a0: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c2b0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c2c0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c2d0: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c2e0: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c2f0: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c300: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c310: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c320: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c330: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c340: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c350: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c360: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c370: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c380: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c390: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c3a0: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c3b0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c3c0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c3d0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c3e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c3f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c400: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c410: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c420: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c430: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c440: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c450: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c460: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c470: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c480: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c490: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c4a0: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c4b0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c4c0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c4d0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c4e0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c4f0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c500: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c510: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c520: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c530: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c540: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c550: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c560: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c570: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c580: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c590: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c5a0: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c5b0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c5c0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c5d0: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
c5e0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
c5f0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
c600: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c610: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
c620: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c630: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
c640: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
c650: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
c660: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
c670: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
c680: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
c690: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
c6a0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c6b0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
c6c0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
c6d0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
c6e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c6f0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c700: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
c710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
c720: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
c730: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
c740: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c750: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
c760: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
c770: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
c780: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
c790: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
c7a0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
c7b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
c7c0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
c7d0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
c7e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7f0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c800: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
c810: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
c820: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
c830: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
c840: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c850: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
c860: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c870: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
c880: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
c890: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c8a0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
c8b0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
c8c0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
c8d0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
c8e0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
c8f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
c900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c910: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
c920: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
c930: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
c940: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
c950: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c960: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
c990: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
c9a0: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
c9b0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
c9e0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
c9f0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
ca00: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
ca10: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
ca20: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
ca30: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
ca40: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
ca50: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
ca60: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
ca70: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
ca80: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
ca90: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
caa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cab0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
cac0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cad0: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cae0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
caf0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cb00: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cb10: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cb20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cb30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cb40: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
cb50: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
cb60: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cb70: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cb80: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
cb90: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
cba0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
cbb0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
cbc0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cbd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
cbe0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
cbf0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
cc00: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
cc10: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
cc20: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
cc30: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
cc40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cc50: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
cc60: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
cc70: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
cc80: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
cc90: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
cca0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
ccb0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
ccc0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
ccd0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
cce0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
ccf0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cd00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cd10: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
cd20: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
cd30: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
cd40: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
cd50: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
cd60: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
cd70: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
cd80: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
cd90: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
cda0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
cdb0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
cdc0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
cdd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cde0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cdf0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
ce00: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
ce10: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
ce20: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
ce30: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
ce40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ce50: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
ce60: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
ce70: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
ce80: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
ce90: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
cea0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
ceb0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
cec0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
ced0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
cee0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
cf10: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cf20: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
cf30: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
cf50: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
cf70: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
cfa0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
cfb0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
cfc0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
cfd0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
cfe0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
cff0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d000: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d010: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d020: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d030: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d040: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d050: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d060: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d070: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d080: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d090: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d0a0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d0b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d0c0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d0d0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d0e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d0f0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d100: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d110: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d120: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d130: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d140: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d150: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d160: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d170: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d180: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d190: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d1a0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d1b0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d1c0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
d1d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d1e0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
d1f0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d200: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d210: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d220: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d230: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d240: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d250: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d260: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d270: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d280: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d290: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d2a0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d2b0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d2c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d2d0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d2e0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d2f0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d300: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d310: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d320: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d330: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d340: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d350: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d360: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d370: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d380: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d390: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d3a0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d3b0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d3c0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d3d0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d3e0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d3f0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
d400: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
d410: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
d420: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
d430: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
d440: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
d450: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
d460: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
d470: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
d480: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
d490: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
d4a0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
d4b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
d4c0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
d4d0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
d4e0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
d4f0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
d500: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d530: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d540: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d550: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
d560: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
d570: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d580: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
d590: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
d5a0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
d5b0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d5c0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
d5d0: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
d5e0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
d5f0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
d600: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
d610: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d620: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d630: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
d640: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d650: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d660: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
d670: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
d680: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d690: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d6a0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
d6b0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
d6c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d6d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
d6e0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
d6f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d700: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
d710: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
d720: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
d730: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
d740: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d750: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d760: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d770: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d780: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d790: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d7a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d7b0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d7c0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
d7d0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
d7e0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
d7f0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
d800: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
d810: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
d820: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
d830: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
d840: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
d850: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
d860: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
d870: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
d880: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
d890: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
d8a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
d8b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d8c0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
d8d0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
d8e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d8f0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
d900: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
d910: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d920: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
d930: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d940: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d950: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
d960: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
d970: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d980: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
d990: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
d9a0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
d9b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d9c0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
d9d0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
d9e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
d9f0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
da00: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
da10: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
da20: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
da30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
da40: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
da50: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
da60: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
da70: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
da80: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
da90: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
daa0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
dab0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
dac0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
dad0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dae0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
daf0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
db00: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
db10: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
db20: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
db30: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
db40: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
db50: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
db60: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
db70: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
db80: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
db90: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
dba0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dbb0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
dbc0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dbd0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dbe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dbf0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
dc00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
dc10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dc20: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dc30: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dc40: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
dc50: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
dc60: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
dc70: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
dc80: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
dc90: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dca0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
dcb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
dcc0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
dcd0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
dce0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
dcf0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
dd20: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
dd30: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dd60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
dd70: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
dd80: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
dd90: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
dda0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
ddb0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
ddc0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
ddd0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
dde0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
ddf0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
de00: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
de10: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
de20: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
de30: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
de40: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
de50: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
de60: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
de70: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
de80: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
de90: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
dea0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
deb0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
dec0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
ded0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
dee0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
def0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
df00: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
df10: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
df20: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
df30: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
df40: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
df50: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
df60: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
df70: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
df80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
df90: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
dfa0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
dfb0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
dfc0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
dfd0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
dfe0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
dff0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e000: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e010: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e020: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e030: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e040: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e050: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e060: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e070: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e080: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e090: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e0a0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e0b0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e0c0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e0d0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e0e0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e0f0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e100: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e110: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e120: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e130: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e140: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e150: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e160: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e170: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e180: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e190: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e1a0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e1b0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e1c0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e1d0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e1e0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e1f0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e200: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e210: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e220: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e230: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e240: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e250: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e260: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e270: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e280: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e290: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e2a0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e2b0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e2c0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e2d0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e2e0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e2f0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e300: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e310: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e320: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e330: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e340: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e350: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e360: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e370: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e390: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e3a0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e3b0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e3c0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e3d0: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e3e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e3f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e400: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e410: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e420: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e430: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e440: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e450: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e460: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e470: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e480: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e490: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e4a0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e4b0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e4c0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e4d0: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e4e0: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e4f0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e500: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e510: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e520: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e530: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e540: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e550: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e560: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e570: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e580: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e590: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e5a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e5b0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e5c0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e5d0: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e5e0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e5f0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e600: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e610: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e620: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e630: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e640: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e650: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e660: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e670: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e680: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e690: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e6a0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e6b0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e6c0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e6d0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e6e0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e6f0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e700: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e710: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e720: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e730: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e740: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e750: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e760: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e770: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e780: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e790: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e7a0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e7b0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e7c0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
e7d0: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
e7e0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
e7f0: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
e800: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
e810: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e820: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
e830: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
e840: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e850: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
e860: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
e870: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
e880: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
e890: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
e8a0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e8b0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
e8c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e8d0: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
e8e0: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
e8f0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
e900: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
e910: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
e920: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
e930: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
e940: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
e950: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
e960: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
e970: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
e980: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
e990: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
e9a0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
e9b0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
e9c0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
e9d0: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
e9e0: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
e9f0: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
ea00: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
ea10: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
ea20: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
ea30: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
ea40: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
ea50: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
ea60: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
ea70: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
ea80: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
ea90: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
eaa0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
eab0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
eac0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
ead0: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
eae0: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
eaf0: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
eb00: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
eb10: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
eb20: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
eb30: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
eb40: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
eb50: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
eb60: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
eb70: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
eb80: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
eb90: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
eba0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ebb0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
ebc0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ebd0: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
ebe0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ebf0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ec00: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ec10: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ec20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ec30: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ec40: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ec50: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
ec60: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
ec70: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
ec80: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
ec90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eca0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
ecb0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
ecc0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ecd0: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
ece0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ecf0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
ed00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ed10: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ed20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
ed30: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ed40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ed50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ed60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
ed70: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
ed80: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
ed90: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
eda0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
edb0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
edc0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
edd0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
ede0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
edf0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
ee00: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
ee10: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
ee20: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
ee30: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
ee40: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
ee50: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
ee60: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
ee70: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
ee80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ee90: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
eea0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
eeb0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
eec0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
eed0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
eee0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
eef0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
ef00: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
ef10: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
ef20: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
ef30: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
ef40: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
ef50: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
ef60: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
ef70: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
ef80: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
ef90: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
efa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
efb0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
efc0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
efd0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
efe0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
eff0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f000: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f010: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f020: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f030: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f040: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f050: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f060: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f070: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f080: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f090: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f0a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f0b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f0c0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f0d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f0f0: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f100: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f110: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f130: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f140: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f150: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f160: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f180: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f190: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f1a0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f1b0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f1c0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f1d0: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f1e0: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f1f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f220: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f230: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f240: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f250: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f260: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f270: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f290: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f2a0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f2b0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f2c0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f2d0: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f2e0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f2f0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f300: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f310: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f320: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f330: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f340: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f350: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f360: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f370: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f380: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f390: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f3a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f3b0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f3c0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f3d0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f3e0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f3f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f400: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f410: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f420: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f430: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f440: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f450: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f460: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f470: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f480: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f490: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f4a0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f4b0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f4c0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f4d0: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f4e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f4f0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f500: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f510: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f520: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f530: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f540: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f550: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f560: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f570: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f590: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f5a0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f5b0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f5c0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f5d0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f5e0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f5f0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f600: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f610: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f620: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f650: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f660: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f670: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f680: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f690: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f6a0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f6b0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f6c0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f6d0: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f6e0: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f6f0: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f700: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f710: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f720: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f730: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f740: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f750: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f760: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f770: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f780: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f790: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f7a0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f7b0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f7c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f7d0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f7e0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f7f0: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
f800: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f810: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f820: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f830: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
f840: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
f850: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
f860: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
f870: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
f880: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
f890: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f8a0: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
f8b0: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
f8c0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
f8d0: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
f8e0: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
f8f0: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
f900: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
f910: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f920: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f930: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f940: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
f950: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
f960: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f970: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f980: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f990: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
f9a0: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
f9b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f9c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
f9d0: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
f9e0: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
f9f0: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
fa00: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
fa10: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
fa20: 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
fa30: 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
fa40: 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
fa50: 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
fa60: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
fa70: 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
fa80: 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
fa90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
faa0: 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
fab0: 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
fac0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fad0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
fae0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
faf0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
fb00: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
fb10: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fb20: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
fb30: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
fb40: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
fb50: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
fb60: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
fb70: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
fb80: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fb90: 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
fba0: 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
fbb0: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
fbc0: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
fbd0: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
fbe0: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
fbf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
fc00: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fc20: 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
fc30: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
fc40: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fc50: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
fc60: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
fc70: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
fc80: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
fc90: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
fca0: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
fcb0: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
fcc0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
fcd0: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
fce0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
fcf0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
fd00: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
fd10: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
fd20: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
fd30: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
fd40: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
fd50: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
fd60: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
fd70: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
fd80: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
fd90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
fda0: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
fdb0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
fdc0: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
fdd0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
fde0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
fdf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
fe00: 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
fe10: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
fe20: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
fe30: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
fe40: 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
fe50: 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
fe60: 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
fe70: 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
fe80: 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
fe90: 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
fea0: 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
feb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fec0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
fed0: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
fee0: 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
fef0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
ff00: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
ff10: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
ff20: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
ff30: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
ff40: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
ff50: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
ff60: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
ff70: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
ff80: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
ff90: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
ffa0: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
ffb0: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
ffc0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
ffd0: 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
ffe0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
fff0: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10000 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10010 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10020 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10030 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10040 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10050 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10060 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
10070 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
10080 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
10090 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
100a0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
100b0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
100c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
100d0 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
100e0 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
100f0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10100 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10110 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10120 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10130 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10140 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10150 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10160 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
10170 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
10180 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10190 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
101a0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
101b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
101c0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
101d0 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
101e0 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
101f0 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10200 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10210 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10220 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10230 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10240 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10250 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10260 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10270 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10280 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10290 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
102a0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
102b0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
102c0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
102d0 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
102e0 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
102f0 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10300 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10310 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10320 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10330 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10340 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10350 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10360 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10370 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10380 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10390 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
103a0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
103b0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
103c0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
103d0 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
103e0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
103f0 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10400 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10410 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10420 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10430 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10440 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10450 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10460 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10480 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10490 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
104c0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
104d0 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10500 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10510 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10520 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10540 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10550 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10560 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10580 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10590 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
105a0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
105b0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
105c0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
105d0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
105e0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
105f0 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10600 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10610 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10620 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10630 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10640 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10650 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
10660 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
10670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10680 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
10690 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
106a0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
106b0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
106c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
106d0 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
106e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
106f0 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
10700 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
10710 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
10720 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
10730 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10740 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10750 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10760 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
10770 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
10780 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
10790 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
107a0 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
107b0 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
107c0 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
107d0 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
107e0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
107f0 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
10800 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
10810 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
10820 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
10830 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10840 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10850 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10860 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10870 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10880 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10890 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
108a0 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
108b0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
108c0 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
108d0 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
108e0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
108f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
10900 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
10910 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
10920 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
10930 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10940 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10950 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10960 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10970 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10980 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10990 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
109a0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
109b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
109c0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
109d0 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
109e0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
109f0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10a00 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10a10 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10a20 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10a30 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10a40 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10a50 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10a60 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
10a70 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10a80 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10a90 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
10aa0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
10ab0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10ac0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
10ad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10af0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
10b00 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
10b10 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
10b20 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
10b30 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
10b40 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
10b50 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
10b60 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
10b70 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
10b80 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
10b90 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
10ba0 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
10bb0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10bc0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
10bd0 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
10be0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
10bf0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
10c00 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
10c10 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
10c20 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
10c30 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10c40 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10c50 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
10c60 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
10c70 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
10c80 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
10c90 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
10ca0 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
10cb0 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
10cc0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
10cd0 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
10ce0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
10cf0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
10d00 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10d10 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
10d20 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
10d30 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
10d40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10d50 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
10d60 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
10d70 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10d80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10d90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10da0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
10db0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
10dc0 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
10dd0 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
10de0 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
10df0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
10e00 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
10e10 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
10e20 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
10e30 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
10e40 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
10e50 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
10e60 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
10e70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
10e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10ea0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
10eb0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
10ec0 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
10ed0 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
10ee0 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
10ef0 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
10f00 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
10f10 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
10f20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
10f30 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
10f40 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
10f50 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
10f60 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
10f70 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
10f80 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
10f90 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
10fa0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
10fb0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
10fc0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
10fd0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
10fe0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
10ff0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
11000 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
11010 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
11020 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
11030 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
11040 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
11050 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11060 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11070 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11080 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11090 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
110a0 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
110b0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
110c0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
110d0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
110e0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
110f0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11100 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11110 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11120 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11130 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11140 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11160 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11170 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11180 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11190 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
111a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
111b0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
111c0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
111d0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
111e0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
111f0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11200 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11210 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11220 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
11230 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11250 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11260 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11270 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11280 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
11290 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
112a0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
112b0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
112c0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
112d0 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
112e0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
112f0 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
11300 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
11310 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
11320 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
11330 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11350 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11360 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11370 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11380 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
11390 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
113a0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
113b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
113c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
113d0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
113e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
113f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11410 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11420 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
11430 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11440 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11450 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11460 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11470 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11480 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
11490 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
114a0 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
114b0 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
114c0 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
114d0 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
114e0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
114f0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
11500 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11510 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
11520 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
11530 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11550 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11560 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11570 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11580 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
11590 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
115a0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
115b0 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
115c0 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
115d0 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
115e0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
115f0 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11600 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
11610 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
11620 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
11630 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11640 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11650 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11660 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11670 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11680 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11690 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
116a0 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
116b0 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
116c0 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
116d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
116e0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
116f0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
11700 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11710 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
11720 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
11730 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11740 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11750 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11760 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11770 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11780 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11790 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
117a0 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
117b0 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
117c0 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
117d0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
117e0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
117f0 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
11800 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
11810 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
11820 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11830 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11840 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11850 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11860 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11870 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11890 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
118a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
118b0 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
118c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
118d0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
118e0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
118f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11900 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
11910 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11920 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
11930 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11940 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11950 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11960 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11970 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11980 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11990 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
119a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
119b0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
119c0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
119d0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
119e0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
119f0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11a00 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11a10 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11a20 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11a30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a50 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11a60 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11a70 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11a80 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11a90 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11aa0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11ab0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11ac0 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11ad0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11ae0 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11af0 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11b00 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11b10 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11b30 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11b40 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11b50 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11b60 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11b70 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11b80 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11b90 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11ba0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11bb0 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11bc0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11bd0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11be0 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
11bf0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11c00 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11c10 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
11c20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11c30 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11c40 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
11c50 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11c60 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11c70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
11c80 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
11c90 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ca0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
11cb0 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
11cc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11cd0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11ce0 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
11cf0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
11d00 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
11d10 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
11d20 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
11d30 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
11d40 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
11d50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11d60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11d70 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
11d80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
11d90 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
11da0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
11db0 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
11dc0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
11dd0 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
11de0 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
11df0 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
11e00 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
11e10 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
11e20 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
11e30 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
11e40 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
11e50 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
11e60 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
11e70 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
11e80 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
11e90 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
11ea0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
11eb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
11ec0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11ed0 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
11ee0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
11ef0 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
11f00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11f10 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
11f20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
11f30 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
11f40 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
11f50 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
11f60 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
11f70 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
11f80 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
11f90 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
11fa0 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
11fb0 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
11fc0 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
11fd0 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
11fe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
11ff0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12000 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
12010 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
12020 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12030 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12040 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12050 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
12070 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
12080 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
12090 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
120a0 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
120b0 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
120c0 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
120d0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
120e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
120f0 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
12100 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
12110 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
12120 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
12130 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12140 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12150 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12160 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
12170 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12180 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12190 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
121a0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
121b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
121c0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
121d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
121e0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
121f0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12200 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
12210 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12220 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
12230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12240 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12250 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12260 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12270 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12280 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12290 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
122a0 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
122b0 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
122c0 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
122d0 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
122e0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
122f0 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
12300 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
12310 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
12320 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
12330 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12340 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12350 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12360 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12370 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12380 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12390 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
123a0 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
123b0 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
123c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
123d0 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
123e0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
123f0 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
12400 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
12410 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
12420 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
12430 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12440 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12450 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12460 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12470 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12480 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12490 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
124a0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
124b0 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
124c0 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
124d0 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
124e0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
124f0 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
12510 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
12520 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
12530 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12540 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12550 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12560 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12570 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12580 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12590 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
125a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
125b0 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
125c0 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
125d0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
125e0 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
125f0 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
12600 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12610 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
12620 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
12630 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12640 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12650 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12660 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12670 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12680 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12690 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
126a0 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
126b0 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
126c0 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
126d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
126e0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
126f0 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
12700 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12710 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
12720 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12730 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12740 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12750 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12760 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12770 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12780 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12790 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
127a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
127b0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
127c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
127d0 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
127e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
127f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12800 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
12810 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
12820 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
12830 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
12840 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
12850 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
12860 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
12870 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
12880 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
12890 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
128a0 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
128b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
128c0 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
128d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
128e0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
128f0 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
12900 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
12910 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
12920 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ction..** .** Th
12930 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
12940 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41  ver called in PA
12950 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
12960 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64   If it is called
12970 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e  .** in PAGER_NON
12980 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45  E or PAGER_SHARE
12990 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  D state and the 
129a0 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73  lock held is les
129b0 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74  s.** exclusive t
129c0 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  han a RESERVED l
129d0 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  ock, it is a no-
129e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  op..**.** Otherw
129f0 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20  ise, any active 
12a00 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72  savepoints are r
12a10 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eleased..**.** I
12a20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12a30 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e  le is open, then
12a40 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65   it is "finalize
12a50 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e  d". Once a journ
12a60 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20  al .** file has 
12a70 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69  been finalized i
12a80 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
12a90 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72  e to use it to r
12aa0 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74  oll back a .** t
12ab0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20  ransaction. Nor 
12ac0 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69  will it be consi
12ad0 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f  dered to be a ho
12ae0 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69  t-journal by thi
12af0 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65  s.** or any othe
12b00 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
12b10 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68  ction. Exactly h
12b20 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ow a journal is 
12b30 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70  finalized.** dep
12b40 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
12b50 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72  or not the pager
12b60 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
12b70 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12b80 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  d.** the current
12b90 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50   journal-mode (P
12ba0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
12bb0 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c   value), as foll
12bc0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ows:.**.**   jou
12bd0 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
12be0 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
12bf0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12c00 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64  is simply closed
12c10 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20  . This destroys 
12c20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65  an .**     in-me
12c30 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  mory journal..**
12c40 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12c50 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  e==TRUNCATE.**  
12c60 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
12c70 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  is truncated to 
12c80 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
12c90 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ze..**.**   jour
12ca0 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12cb0 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73  .**     The firs
12cc0 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68  t 28 bytes of th
12cd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
12ce0 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20  re zeroed. This 
12cf0 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20  invalidates.**  
12d00 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75     the first jou
12d10 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  rnal header in t
12d20 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e  he file, and hen
12d30 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  ce the entire jo
12d40 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
12d50 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f  e. An invalid jo
12d60 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
12d70 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
12d80 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12d90 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a  lMode==DELETE.**
12da0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
12db0 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20   file is closed 
12dc0 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e  and deleted usin
12dd0 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
12de0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  e()..**.**     I
12df0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
12e00 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
12e10 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d  ive mode, this m
12e20 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a  ethod of finaliz
12e30 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a  ing.**     the j
12e40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
12e50 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65  ever used. Inste
12e60 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ad, if the journ
12e70 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20  alMode is.**    
12e80 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
12e90 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
12ea0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
12eb0 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
12ec0 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f   under.**     jo
12ed0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
12ee0 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  ST is used inste
12ef0 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ad..**.** After 
12f00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  the journal is f
12f10 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61  inalized, the pa
12f20 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47  ger moves to PAG
12f30 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e  ER_READER state.
12f40 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69  .** If running i
12f50 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20  n non-exclusive 
12f60 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74  rollback mode, t
12f70 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  he lock on the f
12f80 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67  ile is .** downg
12f90 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45  raded to a SHARE
12fa0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51  D_LOCK..**.** SQ
12fb0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
12fc0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
12fd0 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
12fe0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
12ff0 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20  g.** any of the 
13000 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  IO operations to
13010 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13020 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e  urnal file or un
13030 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  lock the.** data
13040 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f  base then the IO
13050 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
13060 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
13070 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  ser. If the .** 
13080 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e  operation to fin
13090 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
130a0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68  l file fails, th
130b0 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c  en the code stil
130c0 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e  l.** tries to un
130d0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
130e0 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e  e file if not in
130f0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
13100 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63   If the.** unloc
13110 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  k operation fail
13120 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20  s as well, then 
13130 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13140 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20  code related.** 
13150 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72  to the first err
13160 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28  or encountered (
13170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  the journal fina
13180 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73  lization one) is
13190 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
131a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
131b0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
131c0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
131d0 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
131e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
131f0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13200 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13210 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13220 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13230 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13240 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13250 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13260 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13270 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13280 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
13290 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
132a0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
132b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
132c0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
132d0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
132e0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
132f0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13300 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13310 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13320 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13330 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13340 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13350 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13360 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13370 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13380 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
13390 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
133a0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
133b0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
133c0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
133d0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
133e0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
133f0 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13400 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13410 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13420 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13430 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13440 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13450 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13460 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13470 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13480 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
13490 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
134a0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
134b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
134c0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
134d0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
134e0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
134f0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13500 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13510 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13520 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13530 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13540 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13560 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13570 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13580 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
13590 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
135a0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
135b0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
135c0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
135d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
135e0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
135f0 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13600 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13610 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13620 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13630 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13640 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13650 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13660 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13670 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13680 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
13690 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
136a0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
136b0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
136c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
136d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
136e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
136f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13700 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13710 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13720 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13730 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13740 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13750 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13760 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13770 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13780 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
137a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
137b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
137c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
137d0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
137e0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
137f0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13800 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13820 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13830 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13840 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13850 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13860 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13870 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13880 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13890 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
138a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
138b0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
138c0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
138d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
138e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
138f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13900 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13910 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13920 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13930 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13940 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13950 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13960 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13970 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13980 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13990 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
139a0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
139b0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
139c0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
139d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
139e0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
139f0 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13a00 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13a10 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13a30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13a40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13a50 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
13a60 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
13a70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13a80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13a90 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
13aa0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
13ab0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13ac0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
13ad0 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
13ae0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13af0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13b00 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
13b10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
13b20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13b30 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
13b40 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
13b50 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
13b60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13b70 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13b80 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73  _CHECK_PAGES.  s
13b90 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
13ba0 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
13bb0 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
13bc0 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20  set_pagehash);. 
13bd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
13be0 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ize==0 && sqlite
13bf0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
13c00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13c10 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
13c20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  *p = pager_looku
13c30 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  p(pPager, 1);.  
13c40 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
13c50 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30   p->pageHash = 0
13c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
13c70 61 67 65 72 55 6e 72 65 66 28 70 29 3b 0a 20 20  agerUnref(p);.  
13c80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
13c90 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
13ca0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
13cb0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
13cc0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
13cd0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13ce0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
13cf0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
13d00 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
13d10 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
13d20 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
13d30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
13d40 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
13d50 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
13d60 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
13d70 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
13d80 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
13d90 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
13da0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
13db0 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
13dc0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
13dd0 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
13de0 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
13df0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
13e00 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
13e10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13e20 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
13e30 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
13e40 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
13e50 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
13e60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
13e70 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
13e80 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
13e90 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13ea0 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
13eb0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
13ec0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
13ed0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
13ee0 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
13ef0 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
13f00 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
13f10 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
13f20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
13f30 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
13f40 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
13f50 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
13f60 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
13f70 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
13f80 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
13f90 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
13fa0 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
13fb0 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
13fc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
13fd0 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
13fe0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
13ff0 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
14000 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
14010 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
14020 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
14030 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
14040 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
14050 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
14060 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
14070 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
14080 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
14090 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
140a0 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
140b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
140c0 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
140d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
140e0 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
140f0 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
14100 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
14110 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
14120 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
14130 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
14140 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
14150 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
14160 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
14170 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
14180 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
14190 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
141a0 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
141b0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
141c0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
141d0 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
141e0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
141f0 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
14200 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
14210 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
14220 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
14230 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
14240 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
14250 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
14260 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
14270 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
14280 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
14290 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
142a0 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
142b0 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
142c0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
142d0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
142e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
142f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14300 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
14310 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
14320 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
14330 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14340 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
14350 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
14360 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14370 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
14380 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
14390 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
143a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
143b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
143c0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
143d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
143e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
143f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14400 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14410 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
14420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14430 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
14440 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
14450 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14460 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
14470 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
14480 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
14490 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
144a0 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
144b0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
144c0 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
144d0 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
144e0 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
144f0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
14500 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
14510 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
14520 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
14530 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14540 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14550 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14560 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14570 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
14580 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
14590 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
145a0 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
145b0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
145c0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
145d0 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
145e0 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
145f0 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
14600 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
14610 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
14620 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
14630 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14640 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14650 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14660 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
14670 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
14680 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
14690 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
146a0 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
146b0 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
146c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
146d0 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
146e0 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
146f0 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
14700 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
14710 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
14720 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
14730 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14740 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14750 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14760 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
14770 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
14780 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
14790 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
147a0 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
147b0 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
147c0 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
147d0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
147e0 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
147f0 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
14800 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
14810 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
14820 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
14830 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
14840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
14850 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
14860 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
14870 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
14880 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
14890 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
148a0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
148b0 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
148c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
148d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
148e0 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
148f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14900 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
14910 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
14920 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
14930 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
14940 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
14950 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
14960 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
14970 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
14980 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
14990 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
149a0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
149b0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
149c0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
149d0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
149e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
149f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
14a00 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
14a10 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
14a20 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
14a30 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
14a40 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
14a70 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
14a80 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
14a90 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
14aa0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
14ab0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
14ac0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
14ad0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
14ae0 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
14af0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
14b00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
14b10 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
14b20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
14b30 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
14b40 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
14b50 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
14b60 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
14b70 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
14b80 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
14b90 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
14ba0 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
14bb0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
14bc0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
14bd0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
14be0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
14bf0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
14c00 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
14c10 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
14c20 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
14c30 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
14c40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14c50 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
14c60 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
14c70 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14c80 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14c90 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14ca0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14cb0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
14cc0 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
14cd0 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
14ce0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
14cf0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
14d00 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
14d10 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
14d20 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
14d30 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
14d40 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
14d50 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
14d60 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
14d70 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
14d80 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
14d90 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
14da0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
14db0 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
14dc0 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
14dd0 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
14de0 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
14df0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
14e00 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
14e10 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
14e20 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
14e30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14e40 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
14e50 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14e60 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14e70 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
14e80 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
14e90 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
14ea0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
14eb0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
14ec0 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
14ed0 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
14ee0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14ef0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
14f00 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
14f10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14f20 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
14f30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14f40 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
14f50 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
14f60 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14f70 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14f80 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
14f90 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
14fa0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
14fb0 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
14fc0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
14fd0 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
14fe0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
14ff0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
15000 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
15010 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
15020 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
15030 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
15040 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
15050 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
15060 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
15070 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
15080 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
15090 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
150a0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
150b0 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
150c0 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
150d0 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
150e0 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
150f0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
15100 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
15110 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
15120 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15130 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
15140 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
15150 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
15160 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
15170 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
15180 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
15190 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
151a0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
151b0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
151c0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
151d0 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
151e0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
151f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15210 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
15220 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15230 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15250 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
15260 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
15270 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
15280 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15290 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
152a0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
152b0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
152c0 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
152d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
152e0 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
152f0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
15300 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
15310 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
15320 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
15330 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
15340 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
15350 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
15360 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
15370 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
15380 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
15390 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
153a0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
153b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
153c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
153d0 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
153e0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
153f0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
15400 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15410 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
15420 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
15430 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15450 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
15460 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
15470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
15480 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
15490 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
154a0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
154b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
154c0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
154d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
154e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
154f0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
15500 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
15510 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
15520 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
15530 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
15540 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15550 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
15560 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
15570 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
15580 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
15590 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
155a0 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
155b0 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
155c0 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
155d0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
155e0 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
155f0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
15600 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
15610 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
15620 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
15630 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15640 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
15650 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
15660 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
15670 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
15680 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
15690 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
156a0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
156b0 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
156c0 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
156d0 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
156e0 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
156f0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
15700 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
15710 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15720 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
15730 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
15740 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
15750 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
15760 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
15770 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15780 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
15790 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
157a0 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
157b0 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
157c0 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
157d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
157e0 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
157f0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
15800 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
15810 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
15820 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
15830 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
15840 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15850 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15860 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
15870 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
15880 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
15890 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
158a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
158b0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
158c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
158d0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
158e0 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
158f0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
15900 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15910 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
15920 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
15930 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
15940 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
15950 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
15960 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
15970 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15980 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
15990 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
159a0 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
159b0 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
159c0 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
159d0 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
159e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
159f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15a00 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
15a10 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
15a20 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
15a30 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
15a40 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
15a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
15a70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
15a80 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
15a90 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
15aa0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
15ab0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
15ac0 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
15ad0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
15ae0 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
15af0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
15b00 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
15b10 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
15b20 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
15b30 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
15b40 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
15b50 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
15b60 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
15b70 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
15b80 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
15b90 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
15ba0 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
15bb0 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
15bc0 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
15bd0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
15be0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
15bf0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
15c00 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
15c10 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
15c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15c30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
15c40 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
15c50 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
15c60 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
15c70 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
15c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15c90 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
15ca0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
15cb0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
15cc0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
15cd0 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
15ce0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15cf0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
15d00 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
15d10 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
15d20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
15d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15d40 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
15d50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15d60 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
15d70 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
15d80 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
15d90 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
15da0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
15db0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
15dc0 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
15dd0 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
15de0 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
15df0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
15e00 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
15e10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
15e30 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
15e40 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
15e50 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
15e60 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
15e70 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
15e80 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
15e90 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
15ea0 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
15eb0 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
15ec0 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
15ed0 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
15ee0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15ef0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
15f00 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
15f10 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
15f20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
15f30 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
15f40 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
15f50 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
15f60 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
15f70 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
15f80 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
15f90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15fa0 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
15fb0 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
15fc0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
15fd0 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
15fe0 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
15ff0 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
16000 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
16010 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
16020 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
16030 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
16040 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
16050 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16060 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
16070 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16080 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
16090 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
160a0 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
160b0 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
160c0 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
160d0 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
160e0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
160f0 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
16100 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
16110 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
16120 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
16130 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
16140 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
16150 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
16160 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
16170 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
16180 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
16190 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
161a0 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
161b0 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
161c0 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
161d0 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
161e0 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
161f0 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
16200 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
16210 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
16220 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
16230 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16240 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
16250 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16260 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
16270 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
16280 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
16290 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
162a0 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
162b0 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
162c0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
162d0 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
162e0 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
162f0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
16300 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16310 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16320 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16330 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16340 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16350 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16360 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
16370 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
16380 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
16390 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
163a0 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
163b0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
163c0 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
163d0 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
163e0 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
163f0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
16400 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
16410 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
16420 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
16430 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16440 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16450 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16460 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
16470 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
16480 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
16490 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
164a0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
164b0 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
164c0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
164d0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
164e0 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
164f0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16500 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
16510 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
16520 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
16530 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
16540 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
16550 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
16560 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
16570 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
16580 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
16590 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
165a0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
165b0 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
165c0 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
165d0 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
165e0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
165f0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16600 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
16610 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
16620 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
16630 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
16640 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
16650 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
16660 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
16670 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
16680 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
16690 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
166a0 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
166b0 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
166c0 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
166d0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
166e0 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
166f0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
16700 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
16710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
16720 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
16730 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
16740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
16750 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16760 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
16770 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
16780 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
16790 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
167a0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
167b0 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
167c0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
167d0 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
167e0 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
167f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16800 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16810 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
16820 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
16830 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
16840 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
16850 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
16860 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
16870 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
16880 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
16890 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
168a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
168b0 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
168c0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
168d0 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
168e0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
168f0 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
16900 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
16910 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
16920 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
16930 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
16940 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
16950 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
16960 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
16970 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
16980 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
16990 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
169a0 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
169b0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
169c0 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
169d0 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
169e0 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
169f0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
16a00 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
16a10 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
16a20 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16a30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
16a40 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
16a50 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61  er->fd, (u8*)aDa
16a60 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
16a70 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
16a80 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
16a90 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
16aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
16ab0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
16ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16ad0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
16ae0 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  {.      CODEC1(p
16af0 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
16b00 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
16b10 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73  _NOMEM);.      s
16b20 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
16b30 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
16b40 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
16b50 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44  Data);.      COD
16b60 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
16b70 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
16b80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61  QLITE_NOMEM, aDa
16b90 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ta);.    }.  }el
16ba0 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72  se if( !isMainJr
16bb0 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a  nl && pPg==0 ){.
16bc0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
16bd0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  s a rollback of 
16be0 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  a savepoint and 
16bf0 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69  data was not wri
16c00 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
16c10 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
16c20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
16c30 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65  in-memory, there
16c40 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a   is a potential.
16c50 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20      ** problem. 
16c60 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  When the page is
16c70 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79   next fetched by
16c80 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
16c90 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  r, it .    ** wi
16ca0 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
16cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16cc0 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  e, which may or 
16cd0 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  may not be .    
16ce0 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20  ** current. .   
16cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65   **.    ** There
16d00 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
16d10 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20   different ways 
16d20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e  this can happen.
16d30 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20   All are quite. 
16d40 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57     ** obscure. W
16d50 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
16d60 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
16d70 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   this can only h
16d80 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66  appen .    ** if
16d90 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20   the page is on 
16da0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74  the free-list at
16db0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16dc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
16dd0 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  hen.    ** popul
16de0 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64  ated, then moved
16df0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
16e00 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20  gerMovepage().. 
16e10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
16e20 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
16e30 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  add an in-memory
16e40 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63   page to the cac
16e50 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  he containing.  
16e60 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75    ** the data ju
16e70 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  st read from the
16e80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61   sub-journal. Ma
16e90 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
16ea0 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64  irty .    ** and
16eb0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65   if the pager re
16ec0 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c  quires a journal
16ed0 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b  -sync, then mark
16ee0 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20   the page as .  
16ef0 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61    ** requiring a
16f00 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65   journal-sync be
16f10 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74  fore it is writt
16f20 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
16f30 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
16f40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16f50 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
16f60 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
16f70 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b  ger->doNotSpill+
16f80 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  +;.    rc = sqli
16f90 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
16fa0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
16fb0 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
16fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
16fd0 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  tSpill==1 );.   
16fe0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16ff0 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72  ill--;.    if( r
17000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
17020 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
17030 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
17040 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
17050 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
17060 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
17070 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
17080 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
17090 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
170a0 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
170b0 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
170c0 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
170d0 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
170e0 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
170f0 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
17100 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
17110 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
17120 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
17130 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
17140 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
17150 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
17160 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
17170 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
17180 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
17190 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
171a0 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
171b0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
171c0 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
171d0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
171e0 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
171f0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
17200 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17210 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
17220 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
17230 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
17240 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
17250 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
17260 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
17270 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
17280 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
17290 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
172a0 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
172b0 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
172c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
172d0 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
172e0 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
172f0 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
17300 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
17310 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
17320 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
17330 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
17340 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
17350 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
17360 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
17370 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
17380 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
17390 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
173a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
173b0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
173c0 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
173d0 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
173e0 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
173f0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
17400 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
17410 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
17420 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
17430 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
17440 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
17450 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
17460 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
17470 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
17480 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
17490 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
174a0 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
174b0 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
174c0 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
174d0 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
174e0 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
174f0 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
17500 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
17510 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
17520 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
17530 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
17540 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
17550 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
17560 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
17570 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
17580 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
17590 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
175a0 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
175b0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
175c0 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
175d0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
175e0 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
175f0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17600 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
17610 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
17620 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
17630 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
17640 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
17650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17660 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
17670 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
17680 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
17690 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
176a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
176b0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
176c0 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
176d0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
176e0 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
176f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
17700 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17710 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73  ager) );.      s
17720 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17730 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
17740 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
17750 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a  pagehash(pPg);..
17760 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
17770 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
17780 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
17790 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
177a0 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
177b0 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
177c0 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
177d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
177e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
177f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
17800 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
17810 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
17820 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
17830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17840 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
17850 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
17860 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
17870 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
17880 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
17890 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
178a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
178b0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
178c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
178d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
178e0 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
178f0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
17900 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17910 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
17920 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
17930 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
17940 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17950 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
17960 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
17970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17980 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
17990 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
179a0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
179b0 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
179c0 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
179d0 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
179e0 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
179f0 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
17a00 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
17a10 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
17a20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
17a30 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
17a40 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
17a50 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
17a60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
17a70 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
17a80 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
17a90 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
17aa0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
17ab0 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
17ac0 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
17ad0 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
17ae0 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
17af0 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
17b00 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
17b10 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
17b20 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
17b30 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
17b40 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
17b50 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
17b60 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
17b70 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
17b80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
17b90 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
17ba0 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
17bb0 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
17bc0 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
17bd0 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
17be0 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
17bf0 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
17c00 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
17c10 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
17c20 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
17c30 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
17c40 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
17c50 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
17c60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
17c70 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
17c80 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
17c90 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
17ca0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
17cb0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
17cc0 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
17cd0 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
17ce0 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
17cf0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
17d00 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
17d10 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
17d20 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
17d30 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
17d40 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
17d50 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
17d60 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
17d70 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
17d80 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
17d90 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
17da0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
17db0 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
17dc0 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
17dd0 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
17de0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
17df0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
17e00 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
17e10 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
17e20 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
17e30 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
17e40 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
17e50 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
17e60 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
17e70 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
17e80 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
17e90 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
17ea0 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
17eb0 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
17ec0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
17ed0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
17ee0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
17ef0 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
17f00 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
17f10 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
17f20 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
17f30 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
17f40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
17f50 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
17f60 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
17f70 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
17f80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
17f90 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
17fa0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
17fb0 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
17fc0 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
17fd0 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
17fe0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
17ff0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18000 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18010 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
18020 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
18030 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18040 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18050 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18070 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18080 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18090 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
180a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
180b0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
180c0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
180f0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18100 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18110 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
18120 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18130 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18140 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18150 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18160 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
18170 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18180 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
18190 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
181a0 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
181b0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
181c0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
181d0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
181e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
181f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18200 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18210 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
18220 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
18230 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
18240 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
18250 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
18260 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
18270 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
18280 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
18290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
182a0 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
182b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
182c0 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
182d0 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
182e0 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
182f0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
18300 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
18310 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
18320 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
18330 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
18340 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
18350 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18360 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
18370 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
18380 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
18390 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
183a0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
183b0 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
183c0 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
183d0 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
183e0 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
183f0 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
18400 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
18410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18420 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
18430 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
18440 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
18450 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
18460 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
18470 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
18480 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
18490 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
184a0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
184b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
184c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
184d0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
184e0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
184f0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
18500 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
18510 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
18520 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
18530 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
18540 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
18550 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
18560 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
18570 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
18580 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
18590 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
185a0 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
185b0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
185c0 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
185d0 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
185e0 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
185f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
18600 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
18610 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
18620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18630 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18640 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
18650 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
18660 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
18670 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
18680 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
18690 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
186a0 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
186b0 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
186c0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
186d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
186e0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
186f0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
18700 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
18710 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
18720 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
18730 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
18740 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
18750 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
18760 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
18770 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
18780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18790 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
187a0 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
187b0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
187c0 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
187d0 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
187e0 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
187f0 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
18800 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
18810 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
18820 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
18830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
18840 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
18850 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
18860 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
18870 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
18880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18890 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
188a0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
188b0 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
188c0 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
188d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
188e0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
188f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
18900 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
18910 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
18920 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
18930 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
18940 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
18950 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
18960 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
18970 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18980 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
18990 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
189a0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
189b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
189c0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
189d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
189e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
189f0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18a00 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
18a10 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
18a20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18a40 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18a50 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
18a60 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
18a70 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
18a80 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
18a90 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
18aa0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
18ab0 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
18ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18ae0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18af0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
18b00 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
18b10 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
18b20 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
18b30 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
18b40 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
18b50 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
18b60 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
18b70 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
18b80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
18b90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18ba0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
18bc0 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
18bd0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
18be0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
18bf0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18c00 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
18c10 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
18c20 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
18c30 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
18c40 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
18c50 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
18c60 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
18c70 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
18c80 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
18c90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18ca0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
18cb0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
18cc0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
18cd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18ce0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
18cf0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
18d00 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
18d10 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
18d20 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
18d30 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
18d40 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
18d50 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
18d60 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
18d70 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
18d80 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
18d90 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
18da0 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
18db0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
18dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
18dd0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
18de0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
18df0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
18e00 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
18e10 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
18e20 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
18e30 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
18e40 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
18e50 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
18e60 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
18e70 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
18e80 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
18e90 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
18ea0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
18eb0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
18ec0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
18ed0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
18ee0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
18ef0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
18f00 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
18f10 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
18f20 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
18f30 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
18f40 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
18f50 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
18f60 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
18f70 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
18f80 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
18f90 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
18fa0 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
18fb0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
18fc0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
18fd0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
18fe0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
18ff0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
19000 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
19010 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
19020 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
19030 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
19040 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
19050 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
19060 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
19070 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
19080 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
19090 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
190a0 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
190b0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
190c0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
190d0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
190e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
190f0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
19100 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
19110 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
19120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
19130 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19140 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
19150 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
19160 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19170 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
19180 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
19190 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
191a0 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
191b0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
191c0 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
191d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
191e0 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
191f0 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
19200 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
19210 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
19220 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
19230 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19240 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19250 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
19260 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
19270 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
19280 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
19290 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
192a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
192b0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
192c0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
192d0 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
192e0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
192f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19300 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
19310 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
19320 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
19330 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19350 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19360 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19380 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
19390 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
193a0 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
193b0 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
193c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
193d0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
193e0 2d 73 7a 50 61 67 65 29 20 3c 20 20 63 75 72 72  -szPage) <  curr
193f0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
19400 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
19410 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
19420 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
19430 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19440 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
19450 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
19460 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
19470 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
19480 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
19490 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
194a0 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
194b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
194c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
194d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
194e0 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
194f0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
19500 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19520 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19530 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
19540 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
19550 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
19560 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
19570 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19580 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
19590 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
195a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
195b0 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
195c0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
195d0 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
195e0 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
195f0 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
19600 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
19610 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
19620 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
19630 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
19640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
19650 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
19660 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
19670 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
19680 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
19690 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
196a0 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
196b0 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
196c0 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
196d0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
196e0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
196f0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19700 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
19710 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
19720 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
19730 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
19740 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
19750 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
19760 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
19770 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
19780 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  OR_SIZE..*/.stat
19790 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
197a0 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
197b0 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
197c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
197d0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
197e0 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
197f0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
19800 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
19810 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
19820 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
19830 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
19840 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
19850 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
19860 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
19870 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
19880 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
19890 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
198a0 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
198b0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
198c0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
198d0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
198e0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
198f0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
19900 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b  sectorSize<32 ){
19910 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
19920 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
19930 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
19940 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  >sectorSize>MAX_
19950 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
19960 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
19970 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
19980 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
19990 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f  ectorSize = MAX_
199a0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
199b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
199c0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
199d0 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
199e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
199f0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
19a00 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
19a10 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
19a20 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
19a30 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
19a40 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
19a50 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
19a60 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
19a70 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
19a80 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
19a90 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
19aa0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
19ab0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
19ad0 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
19ae0 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
19af0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
19b00 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
19b10 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
19b20 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
19b30 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
19b40 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
19b50 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
19b60 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
19b70 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19b80 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19b90 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
19ba0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
19bb0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
19bc0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
19bd0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
19be0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19bf0 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
19c00 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
19c10 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
19c20 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
19c30 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
19c40 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
19c50 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
19c60 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
19c70 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
19c80 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
19c90 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
19ca0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
19cb0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19cc0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
19cd0 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
19ce0 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
19cf0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
19d00 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
19d10 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
19d20 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
19d30 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
19d40 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
19d50 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
19d60 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
19d70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19d80 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
19d90 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19da0 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
19db0 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
19dc0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
19dd0 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
19de0 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
19df0 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
19e00 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
19e10 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
19e20 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
19e30 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
19e40 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
19e50 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
19e60 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
19e70 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19e80 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
19e90 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
19ea0 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
19eb0 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
19ec0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
19ed0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
19ee0 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
19ef0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
19f00 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
19f10 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
19f20 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
19f30 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
19f40 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
19f50 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
19f60 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
19f70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19f80 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
19f90 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
19fa0 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
19fb0 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
19fc0 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
19fd0 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
19fe0 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
19ff0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1a000 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
1a010 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
1a020 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
1a030 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
1a040 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
1a050 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
1a060 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
1a070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1a080 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
1a090 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
1a0a0 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
1a0b0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
1a0c0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1a0d0 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
1a0e0 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
1a0f0 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
1a100 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
1a110 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
1a120 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
1a130 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
1a140 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
1a150 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
1a160 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
1a170 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
1a180 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
1a190 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
1a1a0 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
1a1b0 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
1a1c0 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
1a1d0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1a1e0 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
1a1f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1a200 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1a210 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
1a220 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
1a230 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
1a240 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
1a250 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1a260 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
1a270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1a280 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
1a290 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
1a2a0 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
1a2b0 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
1a2c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
1a2d0 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
1a2e0 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
1a2f0 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
1a300 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
1a310 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1a320 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
1a330 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
1a340 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
1a350 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1a360 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1a370 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
1a380 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
1a390 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
1a3a0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
1a3b0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
1a3c0 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
1a3d0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
1a3e0 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
1a3f0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
1a400 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
1a410 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
1a420 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
1a430 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1a440 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
1a450 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
1a460 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
1a470 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
1a480 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
1a490 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
1a4a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
1a4b0 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
1a4c0 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
1a4d0 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
1a4e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1a4f0 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
1a500 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
1a510 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1a520 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1a530 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
1a540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a550 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1a560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
1a570 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1a580 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
1a590 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a5a0 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
1a5b0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
1a5c0 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
1a5d0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1a5e0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1a5f0 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
1a600 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1a610 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
1a620 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
1a630 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1a660 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
1a670 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
1a680 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1a690 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1a6a0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
1a6b0 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
1a6c0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
1a6d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
1a6e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a6f0 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
1a700 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
1a710 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1a720 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
1a730 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
1a740 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20  e rollback */.. 
1a750 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1a760 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1a770 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1a780 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1a790 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1a7a0 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1a7b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1a7c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1a7d0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1a7e0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1a7f0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1a800 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1a820 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1a830 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1a840 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a850 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1a860 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1a870 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1a880 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1a890 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1a8a0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1a8b0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1a8c0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1a8d0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1a8e0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1a8f0 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1a900 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1a910 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1a920 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1a930 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1a940 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1a950 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1a960 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1a970 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1a980 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1a990 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1a9a0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1a9b0 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1a9c0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1a9d0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1a9e0 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1a9f0 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1aa00 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1aa10 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1aa20 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1aa30 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1aa40 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1aa50 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1aa60 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1aa70 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1aa80 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1aa90 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1aaa0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1aab0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1aac0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1aad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1aae0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1aaf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1ab00 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1ab10 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1ab20 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1ab30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1ab40 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1ab50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1ab60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1ab70 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1ab80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ab90 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1aba0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1abb0 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1abc0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1abd0 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1abe0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1abf0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1ac00 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1ac10 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1ac20 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1ac30 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1ac40 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1ac50 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1ac60 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1ac70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1ac80 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1ac90 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1aca0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1acb0 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1acc0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1acd0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1ace0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1acf0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1ad00 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1ad10 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1ad20 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1ad30 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1ad40 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1ad50 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1ad60 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1ad70 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1ad80 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1ad90 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1ada0 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1adb0 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1adc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1add0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ade0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1adf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ae00 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1ae10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1ae20 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1ae30 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1ae40 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1ae50 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1ae60 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1ae70 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1ae80 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1ae90 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1aea0 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1aeb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1aec0 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1aed0 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1aee0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1aef0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1af00 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1af10 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1af20 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1af30 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1af40 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1af50 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1af60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1af70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1af80 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1af90 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1afa0 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1afb0 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1afc0 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1afd0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1afe0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1aff0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1b000 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1b010 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1b020 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1b030 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1b040 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1b050 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1b060 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1b070 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1b080 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1b090 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1b0a0 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1b0b0 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1b0c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1b0d0 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1b0e0 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1b0f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b100 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1b110 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1b120 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1b130 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1b140 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1b150 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1b160 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1b170 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1b180 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1b190 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1b1a0 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1b1b0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1b1c0 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1b1d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b1e0 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1b1f0 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1b200 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1b210 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1b220 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1b230 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1b240 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1b250 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1b260 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1b270 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1b280 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1b290 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1b2a0 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1b2b0 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1b2c0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1b2d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b2e0 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1b2f0 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1b300 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1b310 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1b320 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1b330 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1b340 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b350 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1b360 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1b370 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1b380 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1b390 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1b3a0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1b3b0 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1b3c0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1b3d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1b3e0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1b3f0 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1b400 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1b410 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1b420 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1b430 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1b440 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1b450 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1b460 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b470 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1b480 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1b490 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1b4a0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1b4b0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1b4c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b4d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1b4e0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1b4f0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1b500 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1b510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1b520 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1b530 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1b540 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1b550 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1b560 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1b570 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1b580 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1b590 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1b5a0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1b5b0 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1b5c0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1b5d0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1b5e0 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1b5f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1b600 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b610 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1b620 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1b630 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1b640 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1b650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b660 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1b670 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1b680 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1b690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1b6a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1b6b0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1b6c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b6d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b6e0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1b6f0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1b700 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1b710 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1b720 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1b730 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1b740 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1b750 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1b760 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1b770 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1b780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b790 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1b7a0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1b7b0 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1b7c0 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1b7d0 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1b7e0 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1b7f0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1b800 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1b810 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1b820 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1b830 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1b840 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1b850 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1b860 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1b870 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b880 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          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 65 6c 73 65 7b 0a 20          }else{. 
1b8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1b8c0 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1b8d0 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1b8e0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1b8f0 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1b900 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1b910 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1b920 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1b930 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1b940 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1b950 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1b960 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1b970 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1b980 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1b990 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1b9a0 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1b9b0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1b9c0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1b9d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1b9e0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b9f0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1ba00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ba10 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1ba20 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1ba30 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1ba40 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1ba50 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1ba60 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1ba70 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1ba80 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1ba90 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1baa0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1bab0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1bac0 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1bad0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1bae0 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1baf0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1bb00 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1bb10 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1bb20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1bb30 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1bb40 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ified..  */.  as
1bb50 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72  sert(.    pPager
1bb60 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  ->fd->pMethods==
1bb70 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ||.    sqlite3
1bb80 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
1bb90 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1bba0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1bbb0 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b  ED,0)>=SQLITE_OK
1bbc0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
1bbd0 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1bbe0 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1bbf0 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1bc00 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1bc10 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1bc20 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1bc30 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1bc40 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1bc50 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1bc60 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1bc70 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1bc80 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1bc90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1bca0 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1bcb0 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1bcc0 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1bcd0 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1bce0 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1bcf0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1bd00 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1bd10 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1bd20 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1bd30 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1bd40 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1bd50 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1bd60 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1bd70 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1bd80 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1bd90 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1bda0 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1bdb0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1bdc0 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1bdd0 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1bde0 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1bdf0 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1be00 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1be10 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1be20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1be30 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1be40 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1be50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1be60 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1be70 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1be80 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1be90 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1bea0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1beb0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1bec0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1bed0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1bee0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1bef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bf00 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  K.   && (pPager-
1bf10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1bf20 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1bf30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1bf40 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a  AGER_OPEN).  ){.
1bf50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bf60 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72  PagerSync(pPager
1bf70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1bf80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bf90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1bfa0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1bfb0 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
1bfc0 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74  ='\0');.    test
1bfd0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1bfe0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1bff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c000 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1c010 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1c020 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1c030 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1c040 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1c050 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1c060 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1c070 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1c080 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1c090 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1c0a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1c0b0 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1c0c0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1c0d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1c0e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1c0f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1c100 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1c110 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1c120 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1c130 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1c140 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1c150 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1c160 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1c170 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1c180 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1c190 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1c1a0 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1c1b0 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1c1c0 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1c1d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1c1e0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1c1f0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1c200 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1c210 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1c220 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
1c230 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1c240 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1c250 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1c260 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1c270 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1c280 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1c290 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1c2a0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1c2b0 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1c2c0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1c2d0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1c2e0 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1c2f0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1c300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c310 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1c320 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c330 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1c340 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1c350 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1c360 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1c370 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1c380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1c390 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1c3a0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1c3b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1c3c0 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1c3d0 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1c3e0 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1c3f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1c400 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1c410 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1c420 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1c430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1c440 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c450 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1c460 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20   isInWal = 0;   
1c470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c480 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20  e if page is in 
1c490 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  log file */.  in
1c4a0 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d  t pgsz = pPager-
1c4b0 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75  >pageSize; /* Nu
1c4c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1c4d0 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
1c4e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1c4f0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1c500 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1c510 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c520 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
1c530 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
1c540 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
1c550 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c560 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1c570 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
1c580 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
1c590 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c5a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c5b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
1c5c0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1c5d0 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
1c5e0 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1c5f0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1c600 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1c610 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c620 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
1c630 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
1c640 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
1c650 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
1c660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c670 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
1c680 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1c690 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1c6a0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1c6b0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1c6c0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1c6d0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1c6e0 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1c6f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c700 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1c710 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1c720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c730 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c740 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1c750 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1c760 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1c770 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1c780 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1c790 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1c7a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1c7b0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1c7c0 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1c7d0 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1c7e0 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1c7f0 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1c800 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1c810 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1c820 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1c830 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1c840 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1c850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1c860 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1c870 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1c880 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1c890 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1c8a0 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1c8b0 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1c8c0 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1c8d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c8e0 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1c8f0 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1c900 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1c910 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1c920 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1c930 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1c940 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1c950 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1c960 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1c970 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1c980 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1c990 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1c9a0 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1c9b0 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
1c9c0 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1c9d0 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1c9e0 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1c9f0 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1ca00 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1ca10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1ca20 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1ca30 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1ca40 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1ca50 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1ca60 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1ca70 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1ca80 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1ca90 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1caa0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1cab0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1cac0 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1cad0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1cae0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1caf0 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1cb00 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
1cb10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1cb20 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
1cb30 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1cb40 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1cb50 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1cb60 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1cb70 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1cb80 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1cb90 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
1cba0 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
1cbb0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1cbc0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1cbd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1cbe0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1cbf0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1cc00 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1cc10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1cc20 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1cc30 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1cc40 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61   at offsets 24 a
1cc50 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20  nd 92 in.** the 
1cc60 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73  header and the s
1cc70 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  qlite version nu
1cc80 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
1cc90 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  6..**.** This is
1cca0 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1ccb0 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61  l update.  See a
1ccc0 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e  lso the pager_in
1ccd0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1cce0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68  ().** routine wh
1ccf0 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73  ich only updates
1cd00 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1cd10 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74  ter if the updat
1cd20 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  e is actually.**
1cd30 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65   needed, as dete
1cd40 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50  rmined by the pP
1cd50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1cd60 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69  tDone state vari
1cd70 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1cd80 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65  void pager_write
1cd90 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1cda0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33  gHdr *pPg){.  u3
1cdb0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1cdc0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1cdd0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1cde0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1cdf0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1ce00 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1ce10 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1ce20 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1ce30 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  Pg->pPager->dbFi
1ce40 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74  leVers)+1;.  put
1ce50 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1ce60 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  Pg->pData)+24, c
1ce70 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1ce80 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65  .  /* Also store
1ce90 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
1cea0 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
1ceb0 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
1cec0 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e  n.  ** bytes 92.
1ced0 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
1cee0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
1cef0 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
1cf00 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69  on number.  ** i
1cf10 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75  s valid. */.  pu
1cf20 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1cf30 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  pPg->pData)+92, 
1cf40 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1cf50 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1cf60 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1cf70 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
1cf80 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a  ION_NUMBER);.}..
1cf90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cfa0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1cfb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1cfc0 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1cfd0 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1cfe0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1cff0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1d000 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1d010 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1d020 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d030 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1d040 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1d050 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1d060 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1d070 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1d080 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1d090 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1d0a0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1d0b0 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1d0c0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1d0d0 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1d0e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1d0f0 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1d100 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1d110 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1d120 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1d130 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1d140 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1d150 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1d160 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1d170 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1d180 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1d190 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1d1a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d1b0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1d1c0 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1d1d0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1d1e0 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1d1f0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1d200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d210 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1d220 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1d230 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1d240 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1d250 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1d260 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1d270 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70  PgHdr *pPg;..  p
1d280 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1d290 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1d2a0 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1d2b0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1d2c0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1d2d0 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1d2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1d2f0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1d300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d310 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1d320 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d340 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d350 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1d360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d370 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1d380 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1d390 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1d3a0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1d3b0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1d3c0 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1d3d0 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1d3e0 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1d3f0 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1d400 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1d410 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1d420 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1d430 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1d440 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1d450 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1d460 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1d470 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1d480 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1d490 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1d4a0 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1d4b0 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1d4c0 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1d4d0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1d4e0 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1d4f0 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1d500 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1d510 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1d520 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1d530 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1d540 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1d550 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1d560 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1d570 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1d580 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1d590 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1d5a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d5b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d5c0 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1d5d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1d5e0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1d5f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1d600 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1d610 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1d620 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1d650 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1d660 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1d670 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1d680 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1d690 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1d6a0 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1d6b0 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1d6c0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1d6d0 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1d6e0 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1d6f0 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1d700 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1d710 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1d720 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1d730 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1d740 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1d750 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1d760 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1d770 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1d780 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1d790 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1d7a0 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1d7b0 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1d7c0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1d7d0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1d7e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1d7f0 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1d800 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1d810 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1d820 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1d830 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1d840 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1d850 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1d860 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1d870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d880 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1d890 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1d8a0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1d8b0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1d8c0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1d8d0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1d8e0 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1d8f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d900 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d910 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1d920 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1d930 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1d940 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1d950 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1d960 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1d970 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1d980 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1d990 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1d9a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1d9b0 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1d9c0 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1d9d0 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1d9e0 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1d9f0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1da00 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1da10 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1da20 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1da30 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1da40 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1da50 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1da60 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1da70 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1da80 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1da90 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1daa0 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1dab0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1dac0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1dad0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1dae0 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1daf0 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1db00 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1db10 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1db20 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1db30 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1db40 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1db50 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1db60 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1db70 6e 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20  nt isCommit,    
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db90 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1dba0 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  s a commit */.  
1dbb0 69 6e 74 20 73 79 6e 63 46 6c 61 67 73 20 20 20  int syncFlags   
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
1dbe0 20 74 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72   to OsSync() (or
1dbf0 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   0) */.){.  int 
1dc00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dc20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23 69  eturn code */.#i
1dc30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1dc40 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1dc50 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ed(SQLITE_CHECK_
1dc60 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a  PAGES).  PgHdr *
1dc70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1dc80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1dc90 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1dca0 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  es */.#endif..  
1dcb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dcc0 70 57 61 6c 20 29 3b 0a 23 69 66 64 65 66 20 53  pWal );.#ifdef S
1dcd0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1dce0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1dcf0 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e   page list is in
1dd00 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
1dd10 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73   */.  for(p=pLis
1dd20 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74  t; p && p->pDirt
1dd30 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  y; p=p->pDirty){
1dd40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1dd50 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79  pgno < p->pDirty
1dd60 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65  ->pgno );.  }.#e
1dd70 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 43 6f  ndif..  if( isCo
1dd80 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  mmit ){.    /* I
1dd90 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  f a WAL transact
1dda0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ion is being com
1ddb0 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73  mitted, there is
1ddc0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69   no point in wri
1ddd0 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20  ting.    ** any 
1dde0 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
1ddf0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20  numbers greater 
1de00 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69  than nTruncate i
1de10 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nto the WAL file
1de20 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69  ..    ** They wi
1de30 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ll never be read
1de40 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20   by any client. 
1de50 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  So remove them f
1de60 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20  rom the pDirty. 
1de70 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e     ** list here.
1de80 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70   */.    PgHdr *p
1de90 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  ;.    PgHdr **pp
1dea0 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1deb0 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1dec0 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 3b 20 70  (*ppNext = p); p
1ded0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1dee0 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d     if( p->pgno<=
1def0 6e 54 72 75 6e 63 61 74 65 20 29 20 70 70 4e 65  nTruncate ) ppNe
1df00 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b  xt = &p->pDirty;
1df10 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1df20 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 0a  t( pList );.  }.
1df30 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1df40 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1df50 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1df60 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1df70 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1df80 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1df90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1dfa0 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1dfb0 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1dfc0 6d 69 74 2c 20 73 79 6e 63 46 6c 61 67 73 0a 20  mit, syncFlags. 
1dfd0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
1dfe0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
1dff0 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
1e000 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
1e010 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1e020 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1e030 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1e040 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1e050 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1e060 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1e070 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1e080 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1e090 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1e0a0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1e0b0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1e0c0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1e0d0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1e0e0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1e0f0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1e100 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1e110 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e120 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1e130 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1e140 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1e150 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e160 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1e170 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1e180 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1e190 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1e1a0 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1e1b0 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1e1c0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1e1d0 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1e1e0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1e1f0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1e200 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1e210 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1e220 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1e230 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1e240 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1e250 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1e260 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1e270 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1e280 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1e290 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e2c0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1e2d0 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1e2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e2f0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1e300 62 65 20 72 65 73 65 74 20 2a 2f 0a 20 20 57 61  be reset */.  Wa
1e310 6c 20 2a 70 57 61 6c 20 3d 20 70 50 61 67 65 72  l *pWal = pPager
1e320 2d 3e 70 57 61 6c 3b 0a 0a 20 20 61 73 73 65 72  ->pWal;..  asser
1e330 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e340 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
1e350 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1e360 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
1e370 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1e380 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
1e390 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
1e3a0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1e3b0 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
1e3c0 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
1e3d0 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
1e3e0 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
1e3f0 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
1e400 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
1e410 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
1e420 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
1e430 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
1e440 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
1e450 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
1e460 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
1e470 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
1e480 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1e490 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1e4a0 6e 73 61 63 74 69 6f 6e 28 70 57 61 6c 29 3b 0a  nsaction(pWal);.
1e4b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e4c0 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1e4d0 61 63 74 69 6f 6e 28 70 57 61 6c 2c 20 70 50 61  action(pWal, pPa
1e4e0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 53 68 6d  ger->readOnlyShm
1e4f0 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
1e500 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e510 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
1e520 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1e530 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
1e540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1e550 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
1e560 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e570 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1e580 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1e590 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
1e5a0 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
1e5b0 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
1e5c0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1e5d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1e5e0 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
1e5f0 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
1e600 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
1e610 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
1e620 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
1e630 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1e640 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1e650 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1e660 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e670 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
1e680 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
1e690 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
1e6a0 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
1e6b0 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
1e6c0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
1e6d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1e6e0 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
1e6f0 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
1e700 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e710 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1e720 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
1e730 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1e740 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1e750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1e760 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
1e770 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
1e780 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
1e790 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
1e7a0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e7b0 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
1e7c0 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
1e7d0 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
1e7e0 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
1e7f0 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
1e800 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
1e810 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1e820 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
1e830 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
1e840 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1e850 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
1e860 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1e870 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
1e880 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
1e890 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
1e8a0 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
1e8b0 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
1e8c0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
1e8d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1e8e0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1e8f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e900 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1e910 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
1e920 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20  >noReadlock );. 
1e930 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
1e940 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
1e950 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
1e960 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1e970 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69  ize was not avai
1e980 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1e990 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20  AL sub-system,. 
1e9a0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74   ** determine it
1e9b0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
1e9c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e9d0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
1e9e0 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
1e9f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ea00 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
1ea10 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1ea20 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a   page-size,.  **
1ea30 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74   round down to t
1ea40 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e  he nearest page.
1ea50 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
1ea60 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a  e larger than 0.
1ea70 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
1ea80 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
1ea90 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c   to contain at l
1eaa0 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20  east one page.. 
1eab0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   */.  if( nPage=
1eac0 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  =0 ){.    i64 n 
1ead0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1eae0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1eaf0 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
1eb00 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  tes */.    asser
1eb10 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1eb20 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1eb30 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1eb40 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1eb50 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1eb60 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1eb70 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1eb80 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
1eb90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1eba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ebb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ebc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61   }.    }.    nPa
1ebd0 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20  ge = (Pgno)(n / 
1ebe0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ebf0 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  );.    if( nPage
1ec00 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20  ==0 && n>0 ){.  
1ec10 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1ec20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1ec30 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1ec40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1ec50 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1ec60 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
1ec70 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1ec80 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1ec90 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1eca0 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1ecb0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1ecc0 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1ecd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1ece0 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1ecf0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1ed00 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1ed10 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
1ed20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1ed30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ed40 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
1ed50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1ed60 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
1ed70 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
1ed80 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1ed90 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
1eda0 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
1edb0 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
1edc0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1edd0 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
1ede0 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
1edf0 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
1ee00 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
1ee10 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
1ee20 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
1ee30 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
1ee40 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1ee50 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
1ee60 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1ee70 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
1ee80 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
1ee90 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1eea0 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
1eeb0 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
1eec0 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
1eed0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1eee0 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
1eef0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
1ef00 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
1ef10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1ef20 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
1ef30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
1ef40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1ef50 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1ef60 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1ef70 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1ef80 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1ef90 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1efa0 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1efb0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1efc0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1efd0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1efe0 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1eff0 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1f000 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1f010 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1f020 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1f030 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1f040 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1f050 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1f060 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1f070 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1f080 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1f090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f0a0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1f0b0 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1f0c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1f0d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1f0e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f0f0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1f100 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f110 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1f120 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  D_LOCK || pPager
1f130 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a  ->noReadlock );.
1f140 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1f150 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1f160 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f180 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
1f190 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
1f1a0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1c0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
1f1d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1f1e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
1f1f0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
1f200 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
1f210 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f220 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1f230 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f240 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1f250 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1f260 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
1f270 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
1f280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1f2a0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
1f2b0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
1f2c0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
1f2d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1f2e0 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
1f2f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f310 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
1f320 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
1f330 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
1f340 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
1f350 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
1f360 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1f370 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1f380 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
1f390 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f3a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f3b0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
1f3c0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
1f3d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f3e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
1f3f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f400 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
1f410 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f420 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1f430 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1f440 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
1f450 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
1f460 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
1f470 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
1f480 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
1f490 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1f4a0 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
1f4b0 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
1f4c0 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
1f4d0 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
1f4e0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
1f4f0 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
1f500 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1f510 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
1f520 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
1f530 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
1f540 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
1f550 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1f560 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
1f570 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
1f580 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
1f590 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
1f5a0 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
1f5b0 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
1f5c0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
1f5d0 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
1f5e0 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
1f5f0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
1f600 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
1f610 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
1f620 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
1f630 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
1f640 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
1f650 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
1f660 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1f670 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
1f680 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1f690 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
1f6a0 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
1f6b0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1f6c0 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
1f6d0 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
1f6e0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1f6f0 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
1f700 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1f710 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
1f720 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
1f730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1f740 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
1f750 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
1f760 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
1f770 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
1f780 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
1f790 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
1f7a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
1f7b0 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
1f7c0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
1f7d0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
1f7e0 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
1f7f0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
1f800 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
1f810 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1f820 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
1f830 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
1f840 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
1f850 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
1f860 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
1f870 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
1f880 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
1f890 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1f8a0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
1f8b0 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
1f8c0 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
1f8d0 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
1f8e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
1f8f0 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
1f900 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
1f910 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
1f920 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1f930 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1f940 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1f950 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
1f960 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
1f970 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
1f980 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
1f990 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
1f9a0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
1f9b0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1f9c0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1f9d0 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
1f9e0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1f9f0 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
1fa00 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
1fa10 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
1fa20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
1fa30 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
1fa40 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
1fa50 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
1fa60 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1fa70 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
1fa80 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
1fa90 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
1faa0 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
1fab0 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
1fac0 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
1fad0 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
1fae0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
1faf0 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
1fb00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fb10 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
1fb20 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
1fb30 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
1fb40 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
1fb50 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb70 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
1fb80 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1fb90 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
1fba0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
1fbb0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
1fbc0 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
1fbd0 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
1fbe0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
1fbf0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1fc00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1fc10 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
1fc20 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1fc30 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
1fc40 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
1fc50 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
1fc60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fc70 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1fc80 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1fc90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1fca0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1fcb0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
1fcc0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
1fcd0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
1fce0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
1fcf0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
1fd00 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
1fd10 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
1fd20 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1fd30 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
1fd40 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
1fd50 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
1fd60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fd70 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1fd80 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1fd90 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
1fda0 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
1fdb0 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
1fdc0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
1fdd0 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
1fde0 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
1fdf0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1fe00 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
1fe10 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
1fe20 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
1fe30 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
1fe40 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1fe50 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1fe60 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
1fe70 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
1fe80 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1fe90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1fea0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1feb0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
1fec0 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
1fed0 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
1fee0 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
1fef0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
1ff00 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
1ff10 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
1ff20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
1ff30 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
1ff40 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
1ff50 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1ff60 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
1ff70 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
1ff80 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
1ff90 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
1ffa0 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
1ffb0 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
1ffc0 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
1ffd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1ffe0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1fff0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
20000 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
20010 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
20020 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
20030 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
20040 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
20050 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
20060 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
20070 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20080 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
20090 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
200a0 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
200b0 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
200c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
200d0 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
200e0 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
200f0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
20100 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
20110 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
20120 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
20130 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
20140 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
20150 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
20160 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
20170 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
20180 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
20190 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
201a0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
201b0 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
201c0 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
201d0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
201e0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
201f0 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
20200 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20210 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
20220 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
20230 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
20240 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
20250 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
20260 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
20270 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
20280 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
20290 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
202a0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
202b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
202c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
202d0 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
202e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
202f0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
20300 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
20310 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
20320 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
20330 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
20340 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
20350 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
20360 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
20370 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
20380 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
20390 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
203a0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
203b0 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
203c0 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
203d0 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
203e0 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
203f0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20400 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
20410 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
20420 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
20430 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
20440 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
20450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
20460 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
20470 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
20480 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
20490 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
204a0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
204b0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
204c0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
204d0 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
204e0 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
204f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20500 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
20510 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
20520 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
20530 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
20540 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
20550 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
20560 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
20570 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
20580 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
20590 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
205a0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
205b0 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
205c0 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
205d0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
205e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
205f0 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
20600 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20610 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
20620 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
20630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
20640 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
20650 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
20660 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20670 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
20680 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
20690 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
206a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
206b0 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
206c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
206d0 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
206e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
206f0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20700 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20710 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20720 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
20730 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20740 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
20750 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
20760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
20770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20780 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
20790 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
207a0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
207b0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
207c0 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
207d0 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
207e0 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
207f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20800 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
20810 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
20820 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
20830 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
20840 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
20850 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
20860 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
20870 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
20880 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20890 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
208a0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76  64 offset = pSav
208b0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
208c0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
208d0 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
208e0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
208f0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
20900 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
20910 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
20920 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
20930 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
20940 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
20950 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
20960 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
20970 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
20980 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
20990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
209a0 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67  fset==ii*(4+pPag
209b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
209c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
209d0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
209e0 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
209f0 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
20a00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
20a10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20a20 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
20a30 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
20a40 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
20a50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20a60 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
20a70 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
20a80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20a90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
20aa0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
20ab0 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
20ac0 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
20ad0 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
20ae0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
20af0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
20b00 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
20b10 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
20b20 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
20b30 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
20b40 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
20b50 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
20b60 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
20b70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
20b80 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
20b90 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
20ba0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
20bb0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
20bc0 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
20bd0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
20be0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20bf0 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
20c00 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
20c10 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
20c20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
20c30 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
20c40 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
20c50 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
20c60 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
20c70 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
20c80 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
20c90 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
20ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
20cb0 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
20cc0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
20cd0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
20ce0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
20cf0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
20d00 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
20d10 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
20d20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
20d30 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
20d40 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
20d50 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
20d70 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
20d80 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
20d90 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
20da0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
20db0 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
20dc0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
20dd0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
20de0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
20df0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
20e00 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
20e10 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
20e20 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
20e30 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
20e40 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
20e50 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
20e70 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
20e80 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
20e90 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
20ea0 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
20eb0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
20ec0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
20ed0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
20ee0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
20ef0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
20f00 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
20f10 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
20f20 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
20f30 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
20f40 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
20f50 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
20f60 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
20f70 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
20f80 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
20f90 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
20fa0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
20fb0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
20fc0 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
20fd0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
20fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
20ff0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
21000 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
21010 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
21020 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
21030 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
21040 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
21050 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
21060 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
21070 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
21080 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
21090 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
210a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
210b0 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
210c0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
210d0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
210e0 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
210f0 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
21100 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
21110 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
21120 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
21130 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
21140 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
21150 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
21160 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
21170 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
21180 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
21190 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
211a0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
211b0 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
211c0 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
211d0 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
211e0 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
211f0 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
21200 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
21210 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a   with NORMAL..**
21220 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
21230 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
21240 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
21250 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
21260 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
21270 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
21280 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
21290 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
212a0 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
212b0 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
212c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
212d0 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
212e0 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
212f0 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
21300 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
21310 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
21320 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
21330 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
21340 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
21350 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
21360 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
21370 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
21380 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
21390 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
213a0 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
213b0 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
213c0 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
213d0 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
213e0 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
213f0 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
21400 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
21410 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
21420 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
21430 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
21440 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
21450 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
21460 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
21470 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
21480 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
21490 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a  Level(.  Pager *
214a0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
214b0 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
214c0 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
214d0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76  for */.  int lev
214e0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  el,            /
214f0 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
21500 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
21510 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
21520 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46  /  .  int bFullF
21530 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50  sync,       /* P
21540 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20  RAGMA fullfsync 
21550 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75  */.  int bCkptFu
21560 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52  llFsync    /* PR
21570 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
21580 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a  fullfsync */.){.
21590 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
215a0 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
215b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
215c0 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
215d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
215e0 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
215f0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
21600 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
21610 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
21620 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
21630 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
21640 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21650 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
21660 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
21670 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
21680 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29  if( bFullFsync )
21690 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
216a0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
216b0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
216c0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
216d0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
216e0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
216f0 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46  e if( bCkptFullF
21700 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  sync ){.    pPag
21710 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
21720 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
21730 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
21740 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
21750 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21760 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
21770 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21780 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21790 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
217a0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
217b0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
217c0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ORMAL;.  }.}.#en
217d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
217e0 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
217f0 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
21800 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
21810 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
21820 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
21830 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
21840 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
21850 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
21860 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
21870 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
21880 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
21890 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
218a0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
218b0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
218c0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
218d0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
218e0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
218f0 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
21900 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
21910 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
21920 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
21930 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
21940 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
21950 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
21960 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
21970 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
21980 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
21990 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
219a0 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
219b0 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
219c0 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
219d0 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
219e0 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
219f0 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
21a00 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
21a10 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
21a20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
21a30 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
21a40 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
21a50 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21a60 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
21a70 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
21a80 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
21a90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
21aa0 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
21ab0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
21ac0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
21ad0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
21ae0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
21af0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
21b00 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
21b10 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
21b20 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
21b30 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
21b40 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
21b50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b70 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21b80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
21b90 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
21ba0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
21bb0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
21bc0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
21bd0 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
21be0 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
21bf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21c00 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
21c10 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
21c20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21c30 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
21c40 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
21c50 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
21c60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21c70 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
21c80 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
21c90 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
21ca0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21cb0 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
21cc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
21cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
21ce0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
21cf0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
21d00 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
21d10 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
21d20 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
21d30 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
21d40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
21d50 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
21d60 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
21d70 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
21d80 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
21d90 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
21da0 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
21db0 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
21dc0 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
21dd0 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
21de0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
21df0 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
21e00 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
21e10 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
21e20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
21e30 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
21e40 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
21e50 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
21e60 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
21e70 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
21e80 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
21e90 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
21eb0 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
21ec0 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
21ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f00 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
21f10 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
21f20 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
21f30 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
21f40 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
21f50 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
21f60 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
21f70 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
21f80 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
21f90 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
21fa0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
21fb0 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
21fc0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
21fd0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
21fe0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
21ff0 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
22000 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
22010 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
22020 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
22030 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
22040 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
22050 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
22060 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
22070 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22080 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
22090 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220b0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
220c0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
220d0 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
220e0 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
220f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
22100 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
22110 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
22120 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
22130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22140 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
22150 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
22160 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
22170 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
22180 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
22190 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
221a0 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
221b0 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
221c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
221d0 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
221e0 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
221f0 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
22200 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
22210 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
22220 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
22230 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
22240 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
22250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
22260 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
22270 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
22280 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
22290 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
222a0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
222b0 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
222c0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
222d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
222e0 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
222f0 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
22300 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
22310 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
22320 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
22330 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
22340 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
22350 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
22360 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
22370 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
22380 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
22390 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
223a0 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
223b0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
223c0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
223d0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
223e0 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
223f0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
22400 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
22410 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
22420 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
22430 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
22440 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
22450 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
22460 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
22470 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
22480 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
22490 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
224a0 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
224b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
224c0 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
224d0 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
224e0 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
224f0 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
22500 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
22510 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
22520 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
22530 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
22540 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
22550 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
22560 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
22570 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
22580 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
22590 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
225a0 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
225b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
225c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
225d0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
225e0 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
225f0 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
22600 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
22610 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
22620 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
22630 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
22640 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
22650 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
22660 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
22670 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
22680 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
22690 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
226a0 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
226b0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
226c0 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
226d0 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
226e0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
226f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22700 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
22710 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
22720 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
22730 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
22740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22750 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
22760 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
22770 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
22780 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
22790 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
227a0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
227b0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
227c0 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
227d0 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
227e0 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
227f0 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
22800 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
22810 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
22820 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
22830 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
22840 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
22850 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
22860 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
22870 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
22880 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
22890 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
228a0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
228b0 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
228c0 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
228d0 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
228e0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
228f0 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
22900 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
22910 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
22920 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
22930 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
22940 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
22950 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
22960 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
22970 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
22980 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
22990 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
229a0 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
229b0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
229c0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
229d0 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
229e0 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
229f0 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
22a00 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
22a10 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
22a20 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
22a30 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
22a40 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
22a50 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
22a60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
22a70 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
22a80 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
22a90 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
22aa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
22ab0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
22ac0 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
22ad0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22af0 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
22b00 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
22b10 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
22b20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
22b30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22b40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22b60 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
22b70 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
22b80 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22b90 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79 74 65 2f   = (Pgno)(nByte/
22ba0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22bb0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22bc0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
22bd0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
22be0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
22bf0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
22c00 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
22c10 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71  = pNew;.      sq
22c20 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
22c30 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
22c40 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
22c50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
22c60 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
22c70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
22c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22c90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
22ca0 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
22cb0 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
22cc0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
22cd0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
22ce0 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
22cf0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
22d00 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
22d10 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
22d20 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
22d30 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
22d40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22d50 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22d60 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
22d70 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
22d80 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
22d90 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
22da0 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
22db0 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
22dc0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
22dd0 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
22de0 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
22df0 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
22e00 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
22e10 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
22e20 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
22e30 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
22e40 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
22e50 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
22e60 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
22e70 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
22e80 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
22e90 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
22ea0 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
22eb0 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
22ec0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
22ed0 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
22ee0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
22ef0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
22f00 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
22f10 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
22f20 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
22f30 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
22f40 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
22f50 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
22f60 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
22f70 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
22f80 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
22f90 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
22fa0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
22fb0 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
22fc0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
22fd0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
22fe0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
22ff0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
23000 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
23010 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
23020 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
23030 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
23040 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
23050 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
23060 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
23070 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
23080 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
23090 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
230a0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
230b0 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
230c0 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
230d0 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
230e0 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
230f0 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
23100 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
23110 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
23120 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
23130 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
23140 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
23150 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
23160 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
23170 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
23180 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
23190 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
231a0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
231b0 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
231c0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
231d0 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
231e0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
231f0 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
23200 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
23210 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
23220 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
23230 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
23240 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
23250 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
23260 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23270 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
23280 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
23290 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
232a0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
232b0 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
232c0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
232d0 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
232e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
232f0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
23300 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
23310 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23320 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
23330 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
23340 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
23350 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
23360 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
23370 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
23380 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
23390 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
233a0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
233b0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
233c0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
233d0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
233e0 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
233f0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
23400 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
23410 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
23420 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
23430 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
23440 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
23450 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
23460 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
23470 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
23480 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
23490 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
234a0 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
234b0 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
234c0 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
234d0 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
234e0 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
234f0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
23500 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
23510 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
23520 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
23530 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
23540 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
23550 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
23560 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
23570 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
23580 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
23590 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
235a0 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
235b0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
235c0 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
235d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
235e0 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
235f0 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
23600 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
23610 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
23620 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
23630 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
23640 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
23650 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
23660 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
23670 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
23680 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
23690 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
236a0 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
236b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
236c0 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
236d0 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
236e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
236f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
23700 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
23710 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
23720 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
23730 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
23740 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
23750 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
23760 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
23770 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
23780 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
23790 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
237a0 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
237b0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
237c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
237d0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
237e0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
237f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
23800 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
23810 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
23820 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
23830 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
23840 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
23850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23860 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23870 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
23890 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
238a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
238b0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
238c0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
238d0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
238e0 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
238f0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
23900 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
23910 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
23920 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23930 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
23940 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
23950 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
23960 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
23970 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
23980 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
23990 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
239a0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
239b0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
239c0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
239d0 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
239e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
239f0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
23a00 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
23a10 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
23a20 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
23a30 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
23a40 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
23a50 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
23a60 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
23a70 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
23a80 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
23a90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23aa0 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
23ab0 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
23ac0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
23ad0 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
23ae0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
23af0 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
23b00 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
23b10 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
23b20 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
23b30 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
23b40 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
23b50 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
23b60 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
23b70 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
23b80 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
23b90 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
23ba0 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
23bb0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
23bc0 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
23bd0 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
23be0 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
23bf0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
23c00 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
23c10 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23c20 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
23c30 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
23c40 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
23c50 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
23c60 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
23c70 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
23c80 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
23c90 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
23ca0 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
23cb0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
23cc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
23cd0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
23ce0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23cf0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
23d00 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
23d30 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
23d40 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
23d50 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
23d60 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
23d70 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
23d80 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
23d90 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
23da0 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
23db0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
23dc0 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
23dd0 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
23de0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
23df0 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
23e00 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
23e10 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
23e20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
23e30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
23e40 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
23e50 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
23e60 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
23e70 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
23e80 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
23e90 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
23ea0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
23eb0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
23ec0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
23ed0 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
23ee0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
23ef0 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
23f00 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
23f10 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
23f20 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
23f30 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
23f40 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
23f50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23f60 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
23f70 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
23f80 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
23f90 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
23fa0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
23fb0 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
23fc0 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
23fd0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
23fe0 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
23ff0 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
24000 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
24010 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
24020 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
24030 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
24040 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
24050 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
24060 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
24070 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
24080 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
24090 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
240a0 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
240b0 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
240c0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
240d0 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
240e0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
240f0 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
24100 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
24110 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
24120 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
24130 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
24140 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
24150 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
24160 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
24170 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
24180 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
24190 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
241a0 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
241b0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
241c0 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
241d0 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
241e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
241f0 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
24200 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24210 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
24220 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
24230 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
24240 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
24250 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
24260 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62  ehaviour would b
24270 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
24280 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
24290 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
242a0 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
242b0 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
242c0 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
242d0 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
242e0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
242f0 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
24300 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24310 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
24320 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
24330 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
24340 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
24350 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
24360 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
24370 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
24380 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
24390 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
243a0 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
243b0 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
243c0 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
243d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
243e0 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
243f0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24400 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
24410 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
24420 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
24430 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
24440 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
24450 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
24460 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
24470 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
24480 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
24490 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
244a0 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
244b0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
244c0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
244d0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
244e0 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
244f0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
24500 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
24510 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
24520 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
24530 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
24540 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
24550 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24560 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
24570 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
24580 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
24590 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
245a0 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
245b0 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
245c0 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
245d0 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
245e0 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
245f0 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
24600 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
24610 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
24620 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
24630 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
24640 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
24650 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24660 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
24670 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24680 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
24690 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
246a0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
246b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
246c0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
246d0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
246e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
246f0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
24700 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24710 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
24720 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24730 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24740 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
24750 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
24760 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
24770 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
24780 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
24790 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
247a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
247b0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
247c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
247d0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
247e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
247f0 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
24800 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
24810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
24820 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
24830 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
24840 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
24850 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
24860 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
24870 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
24880 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
24890 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
248a0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
248b0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
248c0 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
248d0 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
248e0 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
248f0 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
24900 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
24910 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
24920 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
24930 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
24940 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
24950 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24960 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
24970 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
24980 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
24990 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
249a0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
249b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
249c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
249d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
249e0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
249f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
24a00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
24a10 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
24a20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
24a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24a40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
24a50 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
24a60 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
24a70 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
24a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24a90 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
24aa0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
24ab0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
24ac0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
24ad0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
24ae0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
24af0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
24b00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24b10 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
24b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
24b30 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
24b40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24b50 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
24b60 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
24b70 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
24b80 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
24b90 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
24ba0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
24bb0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
24bc0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
24bd0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
24be0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
24bf0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
24c00 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24c10 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
24c20 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
24c30 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
24c40 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
24c50 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
24c60 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
24c70 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
24c80 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
24c90 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
24ca0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
24cb0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
24cc0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
24cd0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
24ce0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
24cf0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
24d00 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24d10 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
24d20 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
24d30 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62  pSpace;..  disab
24d40 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24d50 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
24d60 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
24d70 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50 61  lloc();.  /* pPa
24d80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
24d90 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
24da0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
24db0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
24dc0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
24dd0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
24de0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
24df0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
24e00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
24e10 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
24e20 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
24e30 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
24e40 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
24e50 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
24e60 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
24e70 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
24e80 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
24e90 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
24ea0 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
24eb0 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
24ec0 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
24ed0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
24ee0 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
24ef0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
24f00 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
24f10 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
24f20 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
24f30 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
24f40 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
24f50 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
24f60 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
24f70 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
24f80 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
24f90 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
24fa0 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
24fb0 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
24fc0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
24fd0 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
24fe0 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
24ff0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
25000 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
25010 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
25020 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
25030 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
25040 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
25050 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
25060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
25070 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
25080 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
25090 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
250a0 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
250b0 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
250c0 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
250d0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
250e0 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
250f0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
25100 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
25110 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
25120 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25130 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
25140 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
25150 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
25160 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
25170 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
25180 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
25190 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
251a0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
251b0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
251c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
251d0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
251e0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
251f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
25200 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
25210 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
25220 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
25230 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
25240 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
25250 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
25260 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
25270 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
25280 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
25290 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
252a0 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
252b0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
252c0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
252d0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
252e0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
252f0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
25300 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
25310 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
25320 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
25330 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
25340 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
25350 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
25360 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
25370 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
25380 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
25390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
253a0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
253b0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
253c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
253d0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
253e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
253f0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
25400 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
25410 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
25420 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
25430 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
25440 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
25450 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
25460 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
25470 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
25480 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
25490 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
254a0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
254b0 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
254c0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
254d0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
254e0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
254f0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
25500 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
25510 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
25520 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
25530 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
25540 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
25550 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
25560 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
25570 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
25580 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
25590 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
255a0 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
255b0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
255c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
255d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
255e0 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
255f0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
25600 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
25610 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
25620 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
25630 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
25640 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
25650 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
25660 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
25670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25680 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
25690 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
256a0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
256b0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
256c0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
256d0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
256e0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
256f0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
25700 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
25710 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
25720 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
25730 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
25740 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
25750 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
25760 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
25770 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
25780 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
25790 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
257a0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
257b0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
257c0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
257d0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
257e0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
257f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25800 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
25810 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
25820 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
25830 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
25840 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
25850 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
25860 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
25870 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
25880 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
25890 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
258a0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
258b0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
258c0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
258d0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
258e0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
258f0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
25900 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
25910 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
25920 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
25930 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
25940 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
25950 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
25960 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
25970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
25980 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
25990 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
259a0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
259b0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
259c0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
259d0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
259e0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
259f0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
25a00 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
25a10 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
25a20 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
25a30 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
25a40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25a50 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
25a60 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
25a70 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
25a80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25a90 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
25aa0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25ac0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25ad0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25ae0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
25af0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
25b00 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
25b10 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
25b20 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
25b30 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
25b40 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
25b50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
25b60 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
25b70 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
25b80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
25b90 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
25ba0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
25bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25bc0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
25bd0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
25be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
25bf0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25c00 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
25c10 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
25c20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25c30 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
25c40 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
25c50 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
25c60 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
25c70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
25c80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
25c90 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
25ca0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25cb0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
25cc0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
25cd0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
25ce0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
25cf0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
25d00 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
25d10 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
25d20 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
25d30 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
25d40 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
25d50 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
25d60 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
25d70 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
25d80 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
25d90 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
25da0 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
25db0 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
25dc0 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
25dd0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
25de0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
25df0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
25e00 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
25e10 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
25e20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
25e30 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
25e40 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
25e50 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
25e60 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
25e70 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
25e80 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
25e90 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
25ea0 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
25eb0 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
25ec0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
25ed0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
25ee0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
25ef0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
25f00 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
25f10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25f20 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
25f30 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
25f40 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
25f50 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
25f60 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
25f70 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
25f80 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
25f90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
25fa0 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
25fb0 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
25fc0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
25fd0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
25fe0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
25ff0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
26000 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
26010 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
26020 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
26030 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
26040 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
26050 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
26060 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
26070 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
26080 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
26090 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
260a0 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
260b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
260c0 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
260d0 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
260e0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
260f0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
26100 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
26110 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
26120 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
26130 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
26140 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
26150 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
26160 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
26170 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
26180 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
26190 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
261a0 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
261b0 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
261c0 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
261d0 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
261e0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
261f0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
26200 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
26210 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
26220 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
26230 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
26240 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
26250 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26260 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
26270 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
26280 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
26290 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
262a0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
262b0 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
262c0 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
262d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
262e0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
262f0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
26300 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
26310 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
26320 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
26330 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
26340 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
26350 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
26360 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
26370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26380 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
26390 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
263a0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
263b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
263c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
263d0 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
263e0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
263f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
26400 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
26410 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
26420 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26430 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
26440 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
26450 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
26460 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
26470 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26480 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
26490 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
264a0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
264b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
264c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
264d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
264e0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
264f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
26500 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
26510 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
26520 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
26530 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
26540 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
26550 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
26560 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
26570 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
26580 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
26590 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
265a0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
265b0 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
265c0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
265d0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
265e0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
265f0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
26600 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
26610 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
26620 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
26630 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
26640 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
26650 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
26660 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
26670 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
26680 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
26690 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
266a0 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
266b0 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
266c0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
266d0 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
266e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
266f0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
26700 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
26710 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
26720 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
26730 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
26740 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
26750 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
26760 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
26770 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
26780 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
26790 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
267a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
267b0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
267c0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
267d0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
267e0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
267f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26800 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
26810 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
26820 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26840 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26850 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
26860 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
26870 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
26880 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26890 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
268a0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
268b0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
268c0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
268d0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
268e0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
268f0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
26900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
26920 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26930 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
26940 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26950 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
26960 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
26970 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
26980 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
26990 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
269a0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
269b0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
269c0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
269d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
269e0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
269f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
26a00 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
26a10 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
26a20 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
26a30 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
26a40 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
26a50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
26a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26a80 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
26a90 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26aa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26ab0 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
26ac0 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
26ad0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
26ae0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
26af0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
26b00 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
26b10 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
26b20 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
26b30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26b40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26b50 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
26b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
26b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
26b80 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
26b90 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
26ba0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
26bb0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
26bc0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
26bd0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
26be0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
26bf0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
26c00 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
26c10 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
26c20 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
26c30 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
26c40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
26c50 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
26c60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
26c70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
26c80 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
26c90 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
26ca0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
26cb0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
26cc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26cd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
26ce0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
26cf0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
26d00 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
26d10 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
26d20 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
26d30 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
26d40 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
26d50 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
26d60 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
26d70 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
26d80 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
26d90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
26da0 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
26db0 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
26dc0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
26dd0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
26de0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
26df0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
26e00 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
26e10 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
26e20 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
26e30 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
26e40 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
26e50 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
26e60 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
26e70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26e80 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
26e90 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
26ea0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
26eb0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
26ec0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
26ed0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
26ee0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
26ef0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
26f00 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
26f10 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
26f20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
26f30 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
26f40 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
26f50 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
26f60 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
26f70 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
26f80 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
26f90 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
26fa0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
26fb0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
26fc0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
26fd0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
26fe0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
26ff0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
27000 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
27010 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
27020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
27030 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
27040 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
27050 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
27060 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
27070 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
27080 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
27090 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
270a0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
270b0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
270c0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
270d0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
270e0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
270f0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
27100 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
27110 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
27120 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
27130 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
27140 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
27150 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
27160 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
27170 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
27180 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
27190 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
271a0 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
271b0 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
271c0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
271d0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
271e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
271f0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
27200 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
27210 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27220 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
27230 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
27240 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
27250 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
27260 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
27270 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
27280 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
27290 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
272a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
272b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
272c0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
272d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
272e0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
272f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27310 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27320 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
27330 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
27340 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
27350 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
27360 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
27370 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
27380 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27390 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
273a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
273b0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
273c0 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
273d0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
273e0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
273f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
27400 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
27410 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
27420 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
27430 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
27440 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
27450 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
27460 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
27470 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
27480 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
27490 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
274a0 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
274b0 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
274c0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
274d0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
274e0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
274f0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
27500 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
27510 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
27520 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
27530 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
27540 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
27550 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
27560 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
27570 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
27580 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
27590 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
275a0 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
275b0 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
275c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
275d0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
275e0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
275f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27600 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
27610 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  e>pPager->dbHint
27620 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Size ){.    sqli
27630 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
27640 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
27650 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
27660 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
27670 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
27680 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
27690 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
276a0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
276b0 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20  , &szFile);.    
276c0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
276d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
276e0 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ize;.  }..  whil
276f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
27700 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
27710 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
27720 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
27730 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
27740 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
27750 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
27760 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
27770 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
27780 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
27790 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
277a0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
277b0 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
277c0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
277d0 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
277e0 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
277f0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
27800 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
27810 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
27820 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
27830 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
27840 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
27850 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
27860 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
27870 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
27880 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
27890 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
278a0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
278b0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
278c0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
278d0 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
278e0 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
278f0 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
27900 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
27910 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
27920 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
27930 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
27940 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
27950 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
27990 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61   */    ..      a
279a0 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66  ssert( (pList->f
279b0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
279c0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
279d0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
279e0 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
279f0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
27a00 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  (pList);..      
27a10 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
27a20 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
27a30 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
27a40 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
27a50 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
27a60 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
27a70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
27a80 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
27a90 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
27aa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
27ab0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
27ac0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
27ad0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
27ae0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
27af0 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
27b00 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
27b10 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
27b20 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
27b30 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
27b40 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
27b50 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
27b60 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
27b70 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
27b80 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
27b90 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
27ba0 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
27bb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27bc0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
27bd0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
27be0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
27bf0 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
27c00 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
27c10 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
27c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
27c30 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
27c40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
27c50 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
27c60 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
27c70 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70    }..      /* Up
27c80 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
27c90 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
27ca0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
27cb0 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
27cc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
27cd0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
27ce0 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
27cf0 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
27d00 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
27d10 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
27d20 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
27d30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
27d40 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
27d50 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
27d60 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
27d70 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
27d80 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
27d90 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
27da0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
27db0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
27dc0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
27dd0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
27de0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
27df0 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
27e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
27e10 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
27e20 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
27e30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27e40 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
27e50 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
27e60 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
27e70 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
27e80 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
27e90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27ea0 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
27eb0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27ec0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
27ed0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
27ee0 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
27ef0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
27f00 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
27f10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
27f20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
27f30 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
27f40 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
27f50 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
27f60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
27f70 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
27f80 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
27f90 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
27fa0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
27fb0 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
27fc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
27fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27fe0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
27ff0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
28000 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
28010 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
28020 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
28030 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
28040 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
28050 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
28060 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
28070 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
28080 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
28090 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
280a0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
280b0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
280c0 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
280d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
280e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
280f0 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
28100 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
28110 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
28120 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
28130 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
28140 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
28150 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
28160 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
28170 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
28180 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
28190 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
281a0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
281b0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
281c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
281d0 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
281e0 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
281f0 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
28200 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
28210 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
28220 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
28230 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
28240 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
28250 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
28260 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
28270 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
28280 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
28290 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
282a0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
282b0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
282c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
282d0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
282e0 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
282f0 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
28300 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
28310 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
28320 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
28330 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
28340 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
28350 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
28360 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
28370 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
28380 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
28390 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
283a0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
283b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
283c0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
283d0 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
283e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
283f0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
28400 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
28410 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28420 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
28430 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
28440 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
28450 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
28460 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
28470 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
28480 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
28490 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
284a0 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
284b0 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20  nal(pPg) .      
284c0 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
284d0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
284e0 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
284f0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
28500 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
28510 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
28520 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
28530 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
28540 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
28550 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
28560 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
28570 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
28580 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
28590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
285a0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
285b0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
285c0 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
285d0 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  et = pPager->nSu
285e0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
285f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
28600 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
28610 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
28620 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
28630 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
28640 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
28650 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
28660 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
28670 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
28680 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
28690 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
286a0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
286b0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
286c0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
286d0 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
286e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
286f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28710 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
28720 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
28730 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
28740 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
28750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
28760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28770 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
28780 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
28790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
287a0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
287b0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
287c0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
287d0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
287e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
287f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
28800 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
28810 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
28820 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
28830 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
28840 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
28850 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
28860 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
28870 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
28880 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
28890 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
288a0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
288b0 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
288c0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
288d0 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
288e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
288f0 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
28900 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
28910 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
28920 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
28930 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
28940 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
28950 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
28960 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
28970 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
28980 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
28990 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
289a0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
289b0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
289c0 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
289d0 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
289e0 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
289f0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
28a00 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
28a10 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
28a20 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
28a30 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
28a40 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
28a50 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
28a60 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
28a70 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
28a80 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
28a90 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
28aa0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
28ab0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
28ac0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
28ad0 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
28ae0 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
28af0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
28b00 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
28b10 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
28b20 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
28b30 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
28b40 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
28b50 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
28b60 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
28b70 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
28b80 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
28b90 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
28ba0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
28bb0 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
28bc0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
28bd0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
28be0 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
28bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28c00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
28c10 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
28c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
28c30 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
28c40 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
28c50 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
28c60 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69  flag is set duri
28c70 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
28c80 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
28c90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
28ca0 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
28cb0 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
28cc0 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
28cd0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
28ce0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
28cf0 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
28d00 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
28d10 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
28d20 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
28d30 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
28d40 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
28d50 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
28d60 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ag inhibits all 
28d70 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72  cache spilling r
28d80 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
28d90 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
28da0 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
28db0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
28dc0 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  t during a rollb
28dd0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ack..  **.  ** S
28de0 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
28df0 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
28e00 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
28e10 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
28e20 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
28e30 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
28e40 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
28e50 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
28e60 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
28e70 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
28e80 71 6c 69 74 65 33 50 43 61 63 68 65 46 65 74 63  qlite3PCacheFetc
28e90 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
28ea0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
28eb0 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
28ec0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
28ed0 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
28ee0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
28ef0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
28f00 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
28f10 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
28f20 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
28f30 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
28f40 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
28f50 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
28f60 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
28f70 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
28f80 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
28f90 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
28fa0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
28fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28fc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
28fd0 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72  NotSpill ) retur
28fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
28ff0 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
29000 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50  SyncSpill && (pP
29010 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
29020 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
29030 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29040 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
29050 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
29060 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
29070 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
29080 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
29090 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
290a0 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
290b0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
290c0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
290d0 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
290e0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
290f0 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
29100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
29120 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
29130 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
29140 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
29150 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
29160 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
29170 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
29180 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
29190 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
291a0 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
291b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
291c0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
291d0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
291e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
291f0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
29200 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
29210 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
29220 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70  number of this p
29230 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  age is larger th
29240 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  an the current s
29250 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ize of.    ** th
29260 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
29270 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  , it may need to
29280 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
29290 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
292a0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
292b0 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
292c0 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
292d0 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
292e0 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  will not.    ** 
292f0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64  actually write d
29300 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ata to the file 
29310 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
29320 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73    **.    ** Cons
29330 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
29340 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
29350 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  vents:.    **.  
29360 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
29370 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
29380 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  l page X>.    **
29390 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67       <modify pag
293a0 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
293b0 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
293c0 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69    **       <shri
293d0 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  nk database file
293e0 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20   to Y pages>.   
293f0 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53   **       pagerS
29400 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20  tress(page X).  
29410 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
29420 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a  K TO sp;.    **.
29430 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c      ** If (X>Y),
29440 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72   then when pager
29450 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64  Stress is called
29460 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74   page X will not
29470 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
29480 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
29490 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74  tabase file, but
294a0 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64   will be dropped
294b0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e   from the cache.
294c0 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f   Then,.    ** fo
294d0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c  llowing the "ROL
294e0 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61  LBACK TO sp" sta
294f0 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20  tement, reading 
29500 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64  page X will read
29510 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  .    ** data fro
29520 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
29530 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
29540 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
29550 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a  ge X as it.    *
29560 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74  * was when the t
29570 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
29580 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61  ed, not as it wa
29590 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e  s when "SAVEPOIN
295a0 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73  T sp".    ** was
295b0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
295c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
295d0 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
295e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
295f0 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
29600 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  to the .    ** s
29610 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29620 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f  now (if it is no
29630 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29  t already there)
29640 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  , so that it wil
29650 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74  l.    ** be rest
29660 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72  ored to its curr
29670 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ent value when t
29680 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
29690 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  sp" is .    ** e
296a0 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  xecuted..    */.
296b0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20      if( NEVER(. 
296c0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
296d0 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e  E_OK && pPg->pgn
296e0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
296f0 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
29700 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20  Page(pPg).    ) 
29710 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
29720 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
29730 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
29740 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
29750 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
29760 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
29770 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
29780 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
297a0 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
297b0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
297c0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
297d0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
297e0 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
297f0 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
29800 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
29810 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
29820 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
29830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
29840 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
29850 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
29860 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
29870 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
29880 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
29890 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
298a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
298b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
298c0 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   rc); .}.../*.**
298d0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
298e0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
298f0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
29900 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
29910 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
29920 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
29930 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
29940 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
29950 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
29960 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
29970 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
29980 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
29990 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
299a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
299b0 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
299c0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
299d0 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
299e0 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
299f0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
29a00 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
29a10 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
29a20 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
29a30 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
29a40 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
29a50 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
29a60 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
29a70 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
29a80 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
29a90 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
29aa0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
29ab0 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
29ac0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
29ad0 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
29ae0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
29af0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
29b00 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
29b10 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
29b20 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
29b30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
29b40 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
29b50 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
29b60 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
29b70 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
29b80 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
29b90 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
29ba0 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
29bb0 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
29bc0 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
29bd0 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
29be0 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
29bf0 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
29c00 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
29c10 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
29c20 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
29c30 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
29c40 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
29c50 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
29c60 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
29c70 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
29c80 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
29c90 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
29ca0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
29cb0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
29cc0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
29cd0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
29ce0 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
29cf0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
29d00 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
29d10 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
29d20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
29d30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
29d40 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
29d50 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
29d60 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
29d70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29d80 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
29d90 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
29da0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
29db0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
29dc0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
29dd0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
29de0 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
29df0 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
29e00 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
29e10 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
29e20 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
29e30 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
29e40 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
29e50 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
29e60 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
29e70 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
29e80 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
29e90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29ea0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
29eb0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
29ec0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
29ed0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
29ee0 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
29ef0 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
29f00 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
29f10 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
29f20 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
29f30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
29f40 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
29f50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
29f60 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
29f70 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
29f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
29f90 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
29fa0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
29fb0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
29fc0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
29fd0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
29fe0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
29ff0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2a000 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2a010 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2a020 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2a030 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2a040 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2a050 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2a060 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2a070 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2a080 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2a090 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2a0a0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2a0b0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2a0c0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2a0d0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2a0e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2a0f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a100 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2a110 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2a120 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2a130 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2a140 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2a150 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2a160 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2a170 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2a180 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2a190 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2a1a0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2a1b0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2a1c0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2a1d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2a1e0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2a1f0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2a200 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2a210 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2a220 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2a230 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2a240 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2a250 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2a260 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2a270 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a280 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2a290 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2a2a0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2a2b0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2a2c0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2a2d0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2a2e0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2a2f0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
2a300 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
2a310 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
2a320 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
2a330 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
2a340 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2a350 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2a360 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2a370 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2a380 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2a390 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2a3a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2a3b0 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2a3c0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2a3d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a3e0 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2a3f0 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2a400 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2a410 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2a420 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2a430 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2a440 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2a450 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2a460 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2a470 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2a480 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2a490 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2a4a0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2a4b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2a4c0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2a4d0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2a4e0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2a4f0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2a500 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2a510 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2a520 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2a530 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2a540 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2a550 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2a560 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2a570 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2a580 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2a590 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2a5a0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2a5b0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2a5c0 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2a5d0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2a5e0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2a5f0 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2a600 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2a610 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2a620 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2a630 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2a640 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2a650 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2a660 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2a670 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2a680 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2a690 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2a6a0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2a6b0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2a6c0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2a6d0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2a6e0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2a6f0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2a700 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2a710 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2a720 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2a730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2a740 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2a750 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2a760 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2a770 3d 20 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  = 1;.    zFilena
2a780 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  me = 0;.  }.#end
2a790 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2a7a0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2a7b0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2a7c0 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2a7d0 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2a7e0 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2a7f0 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2a800 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2a810 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2a820 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2a830 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2a840 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2a850 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2a860 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2a870 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2a880 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a890 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2a8a0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2a8b0 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2a8c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
2a8d0 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
2a8e0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
2a8f0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2a900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a910 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2a920 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2a930 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2a940 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2a950 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2a960 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2a970 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2a980 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2a990 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2a9a0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2a9b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2a9c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2a9d0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2a9e0 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2a9f0 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2aa00 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2aa10 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2aa20 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2aa30 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2aa40 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2aa50 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2aa60 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2aa70 20 20 20 6e 55 72 69 20 3d 20 26 7a 5b 31 5d 20     nUri = &z[1] 
2aa80 2d 20 7a 55 72 69 3b 0a 20 20 20 20 69 66 28 20  - zUri;.    if( 
2aa90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2aaa0 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2aab0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2aac0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2aad0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2aae0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2aaf0 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2ab00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2ab10 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2ab20 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2ab30 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2ab40 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2ab50 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2ab60 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2ab70 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2ab80 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2ab90 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2aba0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2abb0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2abc0 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2abd0 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2abe0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2abf0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2ac00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ac10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2ac20 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2ac30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ac40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ac50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
2ac60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2ac70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2ac80 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2ac90 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2aca0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2acb0 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2acc0 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2acd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ace0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2acf0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2ad00 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2ad10 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2ad20 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2ad30 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2ad40 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2ad50 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2ad70 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2ad80 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2ad90 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2adb0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2adc0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2add0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2ade0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2adf0 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2ae00 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2ae10 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2ae20 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2ae30 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2ae40 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2ae50 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2ae60 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2ae70 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2ae80 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2ae90 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2aea0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2aeb0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2aec0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2aed0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2aee0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2aef0 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2af00 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2af10 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2af20 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2af30 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2af40 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2af50 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2af60 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2af70 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2af80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2af90 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2afa0 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2afb0 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2afc0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2afd0 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2afe0 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2aff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b000 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2b010 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2b020 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2b030 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2b040 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2b050 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20  athname + 8 + 1 
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b070 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2b080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b090 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2b0a0 61 6d 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20  ame + 4 + 1     
2b0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2b0c0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2b0d0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b0e0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2b0f0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2b100 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2b110 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2b120 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2b130 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
2b140 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b150 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
2b160 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2b170 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2b180 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2b190 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2b1a0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2b1b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2b1c0 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2b1d0 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2b1e0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2b1f0 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2b200 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2b210 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2b220 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b230 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2b240 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2b250 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2b260 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2b270 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2b280 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2b290 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2b2a0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2b2b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2b2c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b2d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2b2e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2b2f0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2b300 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2b310 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2b320 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2b330 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2b340 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2b350 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2b360 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2b370 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2b380 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2b390 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2b3a0 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  1 + nUri);.    m
2b3b0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
2b3c0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
2b3d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2b3e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2b3f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2b400 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2b410 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2b420 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2b430 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2b440 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2b450 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2b460 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2b470 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
2b480 2c 20 38 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 8);.#ifndef SQ
2b490 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2b4a0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2b4b0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2b4c0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2b4d0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2b4e0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2b4f0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2b500 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2b510 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2b520 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20  hname], "-wal", 
2b530 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  4);.#endif.    s
2b540 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
2b550 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2b560 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2b570 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2b580 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2b590 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2b5a0 4f 6e 6c 79 53 68 6d 20 3d 20 28 66 6c 61 67 73  OnlyShm = (flags
2b5b0 20 26 20 50 41 47 45 52 5f 52 45 41 44 4f 4e 4c   & PAGER_READONL
2b5c0 59 53 48 4d 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20  YSHM)!=0;..  /* 
2b5d0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2b5e0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2b5f0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2b600 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2b610 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b630 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2b640 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2b650 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2b660 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2b670 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2b680 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2b690 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2b6a0 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2b6b0 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2b6c0 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2b6d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2b6e0 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2b6f0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2b700 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2b710 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2b720 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2b730 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2b740 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2b750 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2b760 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2b770 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2b780 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2b790 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2b7a0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2b7b0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2b7c0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2b7d0 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2b7e0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2b7f0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2b800 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2b810 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2b820 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2b830 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2b840 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2b850 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2b860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2b870 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2b880 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2b890 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
2b8a0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2b8b0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2b8c0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2b8d0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2b8e0 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2b8f0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2b900 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2b910 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2b920 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2b930 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2b940 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2b950 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2b960 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2b970 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2b980 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b990 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2b9a0 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2b9b0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2b9c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2b9d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2b9e0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2b9f0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2ba00 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2ba10 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2ba20 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2ba30 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
2ba40 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
2ba50 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2ba60 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2ba70 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2ba80 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2ba90 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2baa0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2bab0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2bac0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2bad0 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2bae0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
2baf0 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2bb00 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2bb10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2bb20 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2bb30 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
2bb40 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
2bb50 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
2bb60 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2bb70 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2bb80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2bb90 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2bba0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2bbb0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2bbc0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2bbd0 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2bbe0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2bbf0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2bc00 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2bc10 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2bc20 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2bc30 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2bc40 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2bc50 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2bc60 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2bc70 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2bc80 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2bc90 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2bca0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2bcb0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2bcc0 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2bcd0 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2bce0 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2bcf0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2bd00 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2bd10 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2bd20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2bd30 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2bd40 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
2bd50 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2bd60 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2bd70 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
2bd80 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2bd90 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2bda0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2bdb0 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2bdc0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2bdd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2bde0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2bdf0 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2be00 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2be10 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2be20 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2be30 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2be40 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2be50 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2be60 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2be70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2be90 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2bea0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2beb0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2bec0 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2bed0 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2bee0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2bef0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2bf00 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bf10 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
2bf20 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
2bf30 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
2bf40 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
2bf50 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2bf60 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2bf70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bf80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2bf90 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2bfa0 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
2bfb0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2bfc0 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2bfd0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2bfe0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bff0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2c000 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2c010 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ject. */.  asser
2c020 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2c030 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55  ;.  nExtra = ROU
2c040 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ND8(nExtra);.  s
2c050 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2c060 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2c070 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c090 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2c0a0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2c0b0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2c0c0 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
2c0d0 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2c0e0 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2c0f0 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2c100 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2c110 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2c120 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2c130 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2c140 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2c150 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2c160 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2c170 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
2c180 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f  noReadlock = (no
2c190 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
2c1a0 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a  Only) ?1:0;.  /*
2c1b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2c1c0 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2c1d0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2c1e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c1f0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2c200 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2c210 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2c220 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2c230 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2c240 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2c250 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2c260 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2c270 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2c280 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2c290 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2c2a0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30  UNLOCK; */.#if 0
2c2b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2c2c0 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d  r->state == (tem
2c2d0 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58  pFile ? PAGER_EX
2c2e0 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f  CLUSIVE : PAGER_
2c2f0 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69  UNLOCK) );.#endi
2c300 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  f.  /* pPager->e
2c310 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2c320 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2c330 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2c340 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2c350 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2c360 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2c370 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2c380 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2c390 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2c3a0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2c3b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2c3c0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2c3d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2c3e0 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2c3f0 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2c400 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2c410 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2c420 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2c430 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2c440 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2c450 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2c460 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2c470 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2c480 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2c490 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2c4a0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2c4b0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2c4c0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
2c4d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
2c4e0 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
2c4f0 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
2c500 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53  ->noSync ? 0 : S
2c510 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2c520 4c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  L;.  pPager->ckp
2c530 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  tSyncFlags = pPa
2c540 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
2c550 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2c560 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2c570 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2c580 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2c590 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2c5a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2c5b0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2c5c0 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2c5d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2c5e0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2c5f0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2c600 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2c610 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2c620 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2c630 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2c640 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2c650 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2c660 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2c670 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2c680 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c690 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2c6a0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2c6b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c6c0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2c6d0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2c6e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2c6f0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2c700 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2c710 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2c720 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2c730 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2c740 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2c750 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2c760 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2c770 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2c780 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2c790 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2c7a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
2c7b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c7c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2c7d0 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2c7e0 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2c7f0 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2c800 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2c810 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2c820 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2c830 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2c840 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2c850 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2c860 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2c870 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2c880 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2c890 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2c8a0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2c8b0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2c8c0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2c8d0 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2c8e0 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2c8f0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2c900 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2c910 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2c920 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2c930 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2c940 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2c950 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2c960 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2c970 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2c980 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2c990 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2c9a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2c9b0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2c9c0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2c9d0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2c9e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2c9f0 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2ca00 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2ca10 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2ca20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ca30 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2ca40 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2ca50 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2ca60 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2ca70 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2ca80 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2ca90 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2caa0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2cab0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2cac0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2cad0 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2cae0 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2caf0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2cb00 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2cb10 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2cb20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2cb30 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2cb40 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2cb50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2cb60 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2cb70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2cb80 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2cb90 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2cba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2cbb0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2cbc0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2cbd0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2cbe0 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2cbf0 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2cc00 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2cc10 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2cc20 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2cc30 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2cc40 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2cc50 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2cc60 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2cc70 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2cc80 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2cc90 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2cca0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2ccb0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2ccc0 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2ccd0 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2cce0 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2ccf0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2cd00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2cd10 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2cd20 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2cd30 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2cd40 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2cd50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2cd60 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2cd70 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2cd80 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2cd90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2cda0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2cdb0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2cdc0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2cdd0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2cde0 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2cdf0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2ce00 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2ce10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2ce20 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2ce30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2ce40 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2ce50 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2ce60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2ce70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2ce80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2ce90 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2cea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ceb0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2cec0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2ced0 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2cee0 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2cef0 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2cf00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2cf10 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2cf20 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2cf30 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2cf40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2cf50 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2cf60 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2cf70 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2cf80 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2cf90 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2cfa0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2cfb0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2cfc0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2cfd0 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2cfe0 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2cff0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2d000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2d010 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2d020 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2d030 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2d040 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2d050 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2d060 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2d070 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2d080 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2d090 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d0a0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2d0b0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2d0c0 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2d0d0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2d0e0 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2d0f0 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2d100 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2d110 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2d120 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2d130 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2d140 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2d150 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2d160 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2d170 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2d180 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2d190 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2d1a0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2d1b0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2d1c0 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2d1d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2d1e0 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2d1f0 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2d200 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2d210 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2d220 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2d230 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2d240 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2d250 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2d260 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2d270 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2d280 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2d290 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2d2a0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2d2b0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2d2c0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2d2d0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2d2e0 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2d2f0 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2d300 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d310 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2d320 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2d330 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d340 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d350 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2d360 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2d370 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
2d380 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2d390 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
2d3a0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
2d3b0 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
2d3c0 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2d3d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
2d3e0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
2d3f0 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
2d400 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
2d410 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
2d420 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
2d430 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
2d440 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
2d450 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
2d460 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
2d470 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
2d480 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
2d490 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
2d4a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d4b0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2d4c0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2d4d0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2d4e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d4f0 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2d500 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2d510 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2d520 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2d530 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
2d540 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2d550 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
2d560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d570 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d580 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
2d590 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2d5a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2d5b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2d5c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
2d5d0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
2d5e0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2d5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d610 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
2d620 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d630 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2d640 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2d650 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
2d660 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
2d670 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
2d680 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
2d690 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2d6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d6b0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2d6c0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
2d6d0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2d6e0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
2d6f0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2d700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d710 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2d720 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
2d730 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
2d740 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
2d750 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
2d760 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
2d770 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
2d780 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2d790 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2d7a0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2d7b0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
2d7c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
2d7d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2d7e0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2d7f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d800 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2d810 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2d820 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
2d830 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
2d840 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2d850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d860 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
2d870 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
2d880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d890 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
2d8a0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
2d8b0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
2d8c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2d8d0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
2d8e0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
2d8f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2d900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d920 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2d930 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2d940 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2d950 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2d960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d970 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2d980 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
2d990 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2d9a0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2d9b0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2d9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2d9d0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
2d9e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2d9f0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
2da00 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
2da10 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
2da20 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
2da30 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
2da40 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
2da50 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
2da60 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2da70 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
2da80 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
2da90 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
2daa0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
2dab0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
2dac0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
2dad0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
2dae0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
2daf0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
2db00 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
2db10 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
2db20 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
2db30 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2db40 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
2db50 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
2db60 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
2db70 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
2db80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
2db90 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
2dba0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
2dbb0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
2dbc0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
2dbd0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
2dbe0 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
2dbf0 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
2dc00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2dc10 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
2dc20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2dc30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2dc40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2dc60 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2dc70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2dc80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2dc90 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
2dca0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
2dcb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dcc0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
2dcd0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
2dce0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
2dcf0 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
2dd00 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
2dd10 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
2dd20 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
2dd30 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
2dd40 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
2dd50 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
2dd60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
2dd70 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
2dd80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2dd90 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
2dda0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
2ddb0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2ddc0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
2ddd0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
2dde0 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
2ddf0 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
2de00 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
2de10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2de20 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
2de30 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2de40 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
2de50 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
2de60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2de70 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
2de80 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
2de90 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
2dea0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
2deb0 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
2dec0 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
2ded0 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
2dee0 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
2def0 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
2df00 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
2df10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
2df20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
2df30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2df40 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
2df50 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
2df60 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
2df70 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
2df80 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
2df90 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
2dfa0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
2dfb0 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
2dfc0 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
2dfd0 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
2dfe0 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
2dff0 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
2e000 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
2e010 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
2e020 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
2e030 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2e040 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
2e050 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
2e060 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2e070 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
2e080 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2e090 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
2e0a0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
2e0b0 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
2e0c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2e0d0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
2e0e0 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
2e0f0 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
2e100 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
2e110 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
2e120 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2e130 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
2e140 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2e150 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
2e160 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
2e170 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
2e180 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
2e190 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2e1a0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
2e1b0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
2e1c0 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
2e1d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2e1e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2e1f0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
2e200 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e210 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e220 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2e230 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e240 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2e250 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2e260 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
2e270 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
2e280 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2e290 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
2e2a0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
2e2b0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
2e2c0 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
2e2d0 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
2e2e0 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
2e2f0 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
2e300 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
2e310 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
2e320 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
2e330 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
2e340 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
2e350 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2e360 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e370 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
2e380 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2e390 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2e3a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2e3b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2e3c0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
2e3d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2e3e0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
2e3f0 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
2e400 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e410 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
2e420 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
2e430 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
2e440 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
2e450 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2e460 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
2e470 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
2e480 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
2e490 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
2e4a0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
2e4b0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
2e4c0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2e4d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e4e0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2e4f0 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  k==0 || pPager->
2e500 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20  readOnly );..   
2e510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
2e520 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  eadlock==0 ){.  
2e530 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2e540 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
2e550 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2e560 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2e570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e580 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2e590 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
2e5a0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
2e5b0 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
2e5c0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CK );.        go
2e5d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2e5e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2e5f0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
2e600 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
2e610 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
2e620 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
2e630 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2e640 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
2e650 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
2e660 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
2e670 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
2e680 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e690 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
2e6a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
2e6b0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
2e6c0 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
2e6d0 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
2e6e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e6f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2e700 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
2e710 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
2e720 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
2e730 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
2e740 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2e750 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
2e760 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
2e770 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
2e780 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
2e790 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
2e7a0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
2e7b0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2e7c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2e7d0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
2e7e0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2e7f0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
2e800 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2e810 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
2e820 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
2e830 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
2e840 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2e850 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
2e860 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
2e870 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
2e880 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
2e890 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
2e8a0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
2e8b0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
2e8c0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
2e8d0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
2e8e0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
2e8f0 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
2e900 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
2e910 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
2e920 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
2e930 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
2e940 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
2e950 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
2e960 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
2e970 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
2e980 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
2e990 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
2e9a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2e9b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2e9c0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2e9d0 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
2e9e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
2e9f0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
2ea00 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
2ea10 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
2ea20 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
2ea30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2ea40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2ea50 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
2ea60 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
2ea70 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2ea80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ea90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2eaa0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2eab0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
2eac0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2ead0 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
2eae0 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
2eaf0 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
2eb00 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2eb10 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2eb20 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
2eb30 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
2eb40 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
2eb50 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
2eb60 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
2eb70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2eb80 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
2eb90 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
2eba0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
2ebb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
2ebc0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
2ebd0 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
2ebe0 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
2ebf0 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
2ec00 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2ec10 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
2ec20 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
2ec30 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
2ec40 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
2ec50 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
2ec60 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
2ec70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2ec80 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2ec90 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2eca0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
2ecb0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
2ecc0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
2ecd0 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
2ece0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
2ecf0 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
2ed00 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
2ed10 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
2ed20 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
2ed30 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
2ed40 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
2ed50 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
2ed60 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
2ed70 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
2ed80 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
2ed90 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2eda0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
2edb0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
2edc0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
2edd0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
2ede0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2edf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ee00 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2ee10 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2ee20 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
2ee30 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
2ee40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ee50 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
2ee60 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
2ee70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2ee80 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
2ee90 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
2eea0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2eeb0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2eec0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
2eed0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2eee0 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
2eef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2ef00 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
2ef10 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2ef20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2ef30 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2ef40 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2ef50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ef60 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2ef70 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2ef80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2ef90 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2efa0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2efb0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
2efc0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2efd0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2efe0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2eff0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
2f000 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f010 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
2f020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f030 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2f040 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f050 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2f060 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f070 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2f080 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2f090 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f0a0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2f0b0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
2f0c0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f0d0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
2f0e0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
2f0f0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
2f100 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
2f110 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
2f120 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
2f130 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
2f140 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
2f150 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
2f160 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
2f170 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
2f180 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
2f190 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
2f1a0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2f1b0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
2f1c0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
2f1d0 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
2f1e0 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
2f1f0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
2f200 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
2f210 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
2f220 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
2f230 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
2f240 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
2f250 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2f260 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
2f270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f280 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2f290 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2f2a0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2f2b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2f2c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
2f2d0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
2f2e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2f2f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f300 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2f310 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2f320 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2f330 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2f340 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
2f350 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
2f360 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
2f370 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2f380 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
2f390 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2f3a0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2f3b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2f3c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f3d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2f3e0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2f3f0 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
2f400 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2f410 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
2f420 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
2f430 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
2f440 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
2f450 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
2f460 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2f470 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
2f480 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
2f490 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2f4a0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
2f4b0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
2f4c0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2f4d0 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
2f4e0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
2f4f0 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
2f500 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
2f510 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
2f520 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
2f530 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
2f540 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
2f550 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
2f560 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
2f570 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
2f580 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f590 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
2f5a0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
2f5b0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
2f5c0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
2f5d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
2f5e0 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
2f5f0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
2f600 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
2f610 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
2f620 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
2f630 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
2f640 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
2f650 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
2f660 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
2f670 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
2f680 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
2f690 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2f6a0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
2f6b0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
2f6c0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
2f6d0 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
2f6e0 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
2f6f0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
2f700 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2f710 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
2f720 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
2f730 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2f740 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
2f750 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
2f760 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2f770 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
2f780 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
2f790 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
2f7a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f7b0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2f7c0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
2f7d0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2f7e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2f7f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2f800 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2f810 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2f820 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2f830 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2f840 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2f850 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2f860 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2f870 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2f880 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2f890 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
2f8a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20  r->tempFile .   
2f8b0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42    && (pPager->pB
2f8c0 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
2f8d0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2f8e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2f8f0 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  >0) .    ){.    
2f900 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
2f910 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
2f920 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
2f930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f940 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
2f950 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
2f960 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
2f970 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
2f980 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
2f990 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
2f9a0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
2f9b0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
2f9c0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
2f9d0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2f9e0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
2f9f0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
2fa00 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
2fa10 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
2fa20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
2fa30 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
2fa40 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
2fa50 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
2fa60 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
2fa70 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
2fa80 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2fa90 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
2faa0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
2fab0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
2fac0 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
2fad0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
2fae0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
2faf0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
2fb00 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
2fb10 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
2fb20 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
2fb30 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
2fb40 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
2fb50 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
2fb60 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
2fb70 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
2fb80 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
2fb90 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
2fba0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
2fbb0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
2fbc0 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
2fbd0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
2fbe0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
2fbf0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2fc00 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
2fc10 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
2fc20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
2fc30 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2fc40 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
2fc50 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
2fc60 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2fc70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2fc80 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2fc90 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
2fca0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
2fcb0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
2fcc0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
2fcd0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
2fce0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
2fcf0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
2fd00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fd10 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
2fd20 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
2fd30 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2fd40 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
2fd50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2fd60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2fd70 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2fd80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2fd90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
2fda0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
2fdb0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
2fdc0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2fdd0 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
2fde0 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
2fdf0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
2fe00 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
2fe10 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
2fe20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
2fe30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
2fe40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2fe50 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
2fe60 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
2fe70 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
2fe80 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
2fe90 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
2fea0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
2feb0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
2fec0 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
2fed0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
2fee0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
2fef0 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
2ff00 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2ff10 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
2ff20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2ff30 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
2ff40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
2ff50 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
2ff60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2ff70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2ff80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2ff90 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
2ffa0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
2ffb0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
2ffc0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2ffd0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2ffe0 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
2fff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
30000 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
30010 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
30020 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
30030 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
30040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30050 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
30060 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
30070 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
30080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30090 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
300a0 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
300b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
300c0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
300d0 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
300e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
300f0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
30100 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
30110 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
30120 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
30130 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
30140 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
30150 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
30160 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
30170 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
30180 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
30190 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
301a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
301b0 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
301c0 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
301d0 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
301e0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
301f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30200 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
30210 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
30220 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
30230 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30240 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
30250 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30260 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
30270 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
30280 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
30290 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
302a0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
302b0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
302c0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
302d0 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
302e0 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
302f0 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
30300 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
30310 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
30320 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
30330 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
30340 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
30350 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
30360 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
30370 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
30380 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
30390 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
303a0 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
303b0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
303c0 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
303d0 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
303e0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
303f0 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
30400 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30410 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
30420 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
30430 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
30440 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
30450 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
30460 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
30470 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
30480 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
30490 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
304a0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
304b0 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
304c0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
304d0 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
304e0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
304f0 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
30500 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
30510 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
30520 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
30530 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
30540 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
30550 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
30560 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30570 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
30580 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
30590 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
305a0 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
305b0 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
305c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
305d0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
305e0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
305f0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
30600 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
30610 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
30620 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
30630 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
30640 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
30650 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
30660 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
30670 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
30680 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
30690 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
306a0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
306b0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
306c0 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
306d0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
306e0 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
306f0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
30700 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
30710 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
30720 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
30730 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
30740 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
30750 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
30760 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
30770 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
30780 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
30790 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
307a0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
307b0 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
307c0 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
307d0 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
307e0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
307f0 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
30800 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
30810 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
30820 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
30830 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
30840 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
30850 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
30860 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
30870 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
30880 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
30890 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
308a0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
308b0 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
308c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
308d0 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
308e0 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
308f0 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
30900 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
30910 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
30920 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
30930 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
30940 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
30950 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
30960 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
30970 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
30980 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
30990 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
309a0 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
309b0 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
309c0 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
309d0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
309e0 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
309f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30a00 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
30a10 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
30a20 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
30a30 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
30a40 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
30a50 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
30a60 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
30a70 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
30a80 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
30a90 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
30aa0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
30ab0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
30ac0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
30ad0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
30ae0 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
30af0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
30b00 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
30b10 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
30b20 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
30b30 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
30b40 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
30b50 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
30b60 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
30b70 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
30b80 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
30b90 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
30ba0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
30bb0 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
30bc0 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
30bd0 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
30be0 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
30bf0 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
30c00 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
30c10 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
30c20 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
30c30 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
30c40 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
30c50 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
30c60 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
30c70 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
30c80 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
30c90 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
30ca0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
30cb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
30cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
30cd0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
30ce0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
30cf0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
30d00 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
30d10 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
30d20 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
30d30 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
30d40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30d50 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
30d60 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
30d70 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
30d80 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
30d90 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
30da0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
30db0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
30dc0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
30dd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
30de0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
30df0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
30e00 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
30e10 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  er) );..  if( pg
30e20 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
30e30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
30e40 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
30e50 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
30e60 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
30e70 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
30e80 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
30e90 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
30ea0 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
30eb0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
30ec0 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
30ed0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
30ee0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
30ef0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
30f00 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
30f10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
30f20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
30f30 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
30f40 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
30f50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
30f60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30f70 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
30f80 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
30f90 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
30fa0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
30fb0 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
30fc0 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
30fd0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
30fe0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
30ff0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
31000 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
31010 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
31020 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
31030 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
31040 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
31050 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
31060 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
31070 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
31080 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
31090 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
310a0 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
310b0 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
310c0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
310d0 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
310e0 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
310f0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
31100 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31110 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
31120 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
31130 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
31140 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
31150 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
31160 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
31170 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
31180 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
31190 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
311a0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
311b0 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   );.    PAGER_IN
311c0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
311d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
311e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
311f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
31200 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
31210 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
31220 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
31230 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
31240 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
31250 2f 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  /..    PAGER_INC
31260 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
31270 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50  ;.    pPg = *ppP
31280 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  age;.    pPg->pP
31290 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
312a0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
312b0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
312c0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
312d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
312e0 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
312f0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
31300 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
31310 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
31320 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
31330 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
31340 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
31350 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
31360 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
31370 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
31380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31390 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
313a0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
313b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
313c0 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72   MEMDB || pPager
313d0 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
313e0 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
313f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
31400 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
31410 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
31420 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
31430 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
31440 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
31450 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
31460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31470 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
31480 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
31490 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
314a0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
314b0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
314c0 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
314d0 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
314e0 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
314f0 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
31500 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
31510 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
31520 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
31530 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
31540 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
31550 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
31560 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
31570 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
31580 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
31590 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
315a0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
315b0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
315c0 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
315d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
315e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
315f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31600 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
31610 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
31620 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
31630 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
31640 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
31650 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
31660 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
31670 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
31690 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
316a0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
316b0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
316c0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
316d0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
316e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
316f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
31700 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
31710 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
31720 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
31730 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
31740 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
31750 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
31760 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
31770 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
31780 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
31790 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
317a0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
317b0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
317c0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
317d0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
317e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
317f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
31800 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
31810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31820 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
31830 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d  gehash(pPg);.  }
31840 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
31850 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
31860 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
31870 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
31880 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
31890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
318a0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
318b0 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
318c0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
318d0 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ..  *ppPage = 0;
318e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
318f0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
31900 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
31910 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
31920 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
31930 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
31940 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
31950 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
31960 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
31970 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
31980 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
31990 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65  cache. .**.** Se
319a0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
319b0 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
319c0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
319d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
319e0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
319f0 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
31a00 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
31a10 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
31a20 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
31a30 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
31a40 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
31a50 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
31a60 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
31a70 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
31a80 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
31a90 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
31aa0 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
31ab0 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
31ac0 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
31ad0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
31ae0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
31af0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
31b00 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73   *pPg = 0;.  ass
31b10 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
31b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
31b30 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
31b40 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
31b50 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
31b60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
31b70 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
31b80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
31b90 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
31ba0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
31bb0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
31bc0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
31bd0 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
31be0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
31bf0 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
31c00 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rence..**.** If 
31c10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
31c20 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
31c30 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
31c40 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
31c50 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
31c60 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
31c70 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
31c80 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
31c90 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
31ca0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
31cb0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
31cc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31cd0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
31ce0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
31cf0 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
31d00 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
31d10 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
31d20 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
31d30 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
31d40 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
31d50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  g);.    pagerUnl
31d60 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
31d70 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
31d80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31d90 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
31da0 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
31db0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
31dc0 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
31dd0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
31de0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
31df0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
31e00 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
31e10 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
31e20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
31e30 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
31e40 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
31e50 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
31e60 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
31e70 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
31e80 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
31e90 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
31ea0 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
31eb0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
31ec0 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
31ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31ee0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
31ef0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31f00 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
31f10 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
31f20 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
31f30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
31f40 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
31f50 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
31f60 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
31f70 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
31f80 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
31f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
31fa0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
31fb0 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
31fc0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
31fd0 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
31fe0 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
31ff0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
32000 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
32010 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
32020 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
32030 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
32040 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
32050 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
32060 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
32070 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
32080 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
32090 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
320a0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
320b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
320c0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
320d0 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
320e0 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
320f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
32100 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
32110 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
32120 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
32130 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
32140 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
32150 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
32160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
32170 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
32180 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
32190 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
321a0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
321b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
321c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
321e0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
321f0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
32200 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
32210 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
32220 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
32230 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
32240 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32250 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
32260 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
32270 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
32280 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
32290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
322a0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
322b0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
322c0 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
322d0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
322e0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
322f0 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
32300 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
32310 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
32320 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
32330 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
32340 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
32350 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
32360 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
32370 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
32380 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
32390 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
323a0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
323b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
323c0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
323d0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
323e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
323f0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
32400 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
32410 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
32420 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
32430 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
32440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32450 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a  NOMEM;.    }.  .
32460 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
32470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
32480 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
32490 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
324a0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
324b0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
324c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
324d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
324e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
324f0 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
32500 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
32510 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32530 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
32540 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
32550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
32560 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
32570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
32580 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
32590 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
325a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
325b0 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70  TE|.          (p
325c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
325d0 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ? .            (
325e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
325f0 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
32600 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
32610 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  AL):.           
32620 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
32630 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
32640 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65        );.  #ifde
32650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
32660 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
32670 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32680 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
32690 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
326a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
326b0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
326c0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
326d0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
326e0 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a       );.  #else.
326f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32700 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
32710 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32720 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
32730 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e  flags, 0);.  #en
32740 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
32750 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
32760 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
32770 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32780 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
32790 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
327a0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
327b0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
327c0 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
327d0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
327e0 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
327f0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
32800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
32820 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
32830 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
32840 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
32850 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
32860 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
32870 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32880 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
32890 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
328a0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
328b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
328c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
328d0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
328e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
328f0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
32900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
32910 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
32920 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
32930 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
32940 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
32950 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
32960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32970 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32980 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32990 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
329a0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
329b0 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
329c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
329d0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
329e0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
329f0 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
32a00 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
32a10 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
32a20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
32a30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
32a40 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
32a50 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
32a60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
32a70 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
32a80 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
32a90 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
32aa0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
32ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
32ac0 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
32ad0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
32ae0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
32af0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
32b00 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
32b10 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
32b20 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
32b30 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
32b40 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
32b50 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
32b60 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
32b70 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
32b80 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
32b90 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
32ba0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
32bb0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
32bc0 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
32bd0 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
32be0 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
32bf0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
32c00 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
32c10 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
32c20 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
32c30 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
32c40 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
32c50 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
32c60 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
32c70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
32c80 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
32c90 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
32ca0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
32cb0 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
32cc0 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
32cd0 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
32ce0 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
32cf0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
32d00 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
32d10 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
32d20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
32d30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
32d40 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
32d50 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
32d60 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
32d70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
32d80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
32d90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
32da0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
32db0 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
32dc0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32dd0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
32de0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
32df0 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
32e00 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
32e10 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
32e20 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
32e30 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
32e40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32e50 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
32e60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
32e70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
32e80 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
32e90 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32ea0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
32eb0 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
32ec0 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
32ed0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
32ee0 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
32ef0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
32f00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
32f10 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
32f20 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
32f30 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
32f40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
32f50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
32f60 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
32f70 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
32f80 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
32f90 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
32fa0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
32fb0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
32fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
32fd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32fe0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
32ff0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
33000 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45       sqlite3WalE
33010 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
33020 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
33030 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
33040 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
33050 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
33060 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
33070 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
33080 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
33090 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
330a0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
330b0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
330c0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
330d0 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
330e0 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
330f0 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
33100 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
33110 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
33120 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
33130 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
33140 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
33150 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
33160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33170 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
33180 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
33190 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
331a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
331b0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
331c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
331d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
331e0 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
331f0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
33200 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
33210 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
33220 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
33230 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
33240 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
33250 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
33260 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
33270 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
33280 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
33290 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
332a0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
332b0 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
332c0 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
332d0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
332e0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
332f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
33300 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
33320 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
33330 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
33340 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
33350 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
33360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
33390 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
333a0 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
333b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
333c0 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
333d0 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
333e0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
333f0 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
33400 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
33410 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
33420 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
33430 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
33440 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
33450 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
33460 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
33470 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
33480 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
33490 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
334a0 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
334b0 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
334c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
334d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
334e0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
334f0 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
33500 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
33510 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
33520 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
33530 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
33540 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
33550 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
33560 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
33570 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
33580 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
33590 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
335a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
335b0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
335c0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
335d0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
335e0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
335f0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33600 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
33610 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
33620 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33630 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
33640 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
33650 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
33660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
33670 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
33680 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
33690 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
336a0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
336b0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
336c0 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
336d0 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
336e0 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
336f0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
33700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33710 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
33720 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
33730 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
33740 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
33750 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
33760 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
33770 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
33780 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
33790 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
337a0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
337b0 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
337c0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
337d0 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
337e0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
337f0 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
33800 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
33810 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
33820 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
33830 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
33840 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
33850 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
33860 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
33870 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
33880 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
33890 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
338a0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
338b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
338c0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
338d0 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
338e0 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
338f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33900 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
33910 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
33920 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
33930 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
33940 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
33950 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
33960 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
33970 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
33980 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
33990 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
339a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
339b0 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
339c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
339d0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
339e0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
339f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33a00 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
33a10 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
33a20 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
33a30 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
33a40 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
33a50 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76  or has been prev
33a60 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c  iously detected,
33a70 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65   report the same
33a80 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69   error.  ** agai
33a90 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  n. This should n
33aa0 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74  ot happen, but t
33ab0 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65  he check provide
33ac0 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  s robustness. */
33ad0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
33ae0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
33af0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
33b00 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
33b10 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
33b20 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
33b30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
33b40 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
33b50 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
33b60 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
33b70 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
33b80 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
33b90 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
33ba0 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
33bb0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
33bc0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
33bd0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
33be0 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
33bf0 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
33c00 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
33c10 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
33c20 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
33c30 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
33c40 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
33c50 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33c60 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
33c70 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
33c80 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
33c90 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
33ca0 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
33cb0 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
33cc0 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
33cd0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
33ce0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
33cf0 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
33d00 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
33d10 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
33d20 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
33d30 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
33d40 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
33d50 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
33d60 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
33d70 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
33d80 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
33d90 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
33da0 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
33db0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
33dc0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
33dd0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
33de0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33df0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
33e00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
33e10 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
33e20 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
33e30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
33e40 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
33e50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33e60 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
33e70 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
33e80 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33e90 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33ea0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
33eb0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
33ec0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
33ed0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
33ee0 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
33ef0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
33f00 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
33f10 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
33f20 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
33f30 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
33f40 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
33f50 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
33f60 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
33f70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
33f80 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
33f90 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c  pPager) );.  }el
33fa0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  se{.  .    /* Th
33fb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
33fc0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
33fd0 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
33fe0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
33ff0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
34000 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
34010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34020 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
34030 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
34040 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34050 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
34060 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
34070 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
34080 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
34090 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65  al(pPg) && !page
340a0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
340b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
340c0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
340d0 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ger)==0 );.     
340e0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
340f0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
34100 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  ze && isOpen(pPa
34110 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
34120 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
34130 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
34140 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36  ata2;.        i6
34150 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
34160 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
34170 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
34180 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
34190 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
341a0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
341b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
341c0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
341d0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
341e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
341f0 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
34200 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
34210 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
34220 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
34230 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
34240 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20  Pager) );..     
34250 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34260 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
34270 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
34280 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  f );.        COD
34290 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
342a0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
342b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
342c0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
342d0 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
342e0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
342f0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
34300 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
34310 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
34320 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
34330 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  urs while journa
34340 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
34350 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
34360 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
34370 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
34380 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
34390 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
343a0 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
343b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
343c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
343d0 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
343e0 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
343f0 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
34400 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
34410 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
34420 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
34430 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
34440 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
34450 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
34460 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
34470 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
34480 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
34490 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
344a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67    */.        pPg
344b0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
344c0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20  _NEED_SYNC;..   
344d0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
344e0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
344f0 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67  d, iOff, pPg->pg
34500 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
34510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34540 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
34550 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
34560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
34570 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  Off+4);.        
34580 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34590 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
345a0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
345b0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
345c0 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
345d0 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
345e0 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sum);.        if
345f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34600 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
34610 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34620 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
34630 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
34640 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
34650 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
34660 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
34670 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34680 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
34690 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
346a0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
346b0 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
346c0 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
346d0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
346e0 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
346f0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
34700 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
34710 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
34720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
34730 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
34740 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
34750 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
34760 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20  (pPg)));..      
34770 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
34780 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
34790 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
347a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
347b0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
347c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
347d0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
347e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
347f0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
34800 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
34810 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
34820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34830 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34840 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
34850 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
34860 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
34870 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34880 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
34890 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
348a0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
348b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
348c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
348d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
348e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
348f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
34900 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
34910 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
34920 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
34930 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
34940 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
34950 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
34960 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
34970 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
34980 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
34990 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
349a0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
349b0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
349c0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
349d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
349e0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
349f0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
34a00 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
34a10 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
34a20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
34a30 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
34a40 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
34a50 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
34a60 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
34a70 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
34a80 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
34a90 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
34aa0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
34ab0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
34ac0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
34ad0 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
34ae0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
34af0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
34b00 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
34b10 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
34b20 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
34b30 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
34b40 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
34b50 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
34b60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
34b70 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
34b80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
34b90 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
34ba0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
34bb0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
34bc0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
34bd0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
34be0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
34bf0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
34c00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
34c10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
34c20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
34c30 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
34c40 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
34c50 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
34c60 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
34c70 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
34c80 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
34c90 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
34ca0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
34cb0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
34cc0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
34cd0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
34ce0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
34cf0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
34d00 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
34d10 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
34d20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
34d30 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
34d40 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
34d50 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
34d60 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
34d70 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
34d80 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
34d90 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
34da0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
34db0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
34dc0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
34dd0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
34de0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
34df0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
34e00 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
34e10 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
34e20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
34e30 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
34e40 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
34e50 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
34e60 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
34e70 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
34e80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
34e90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
34ea0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
34eb0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
34ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
34ed0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
34ee0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
34ef0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
34f00 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
34f10 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
34f20 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
34f30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34f40 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
34f50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
34f60 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
34f70 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
34f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
34f90 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
34fa0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
34fb0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
34fc0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  r) );..  if( nPa
34fd0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
34fe0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
34ff0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
35000 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
35010 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
35020 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
35030 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
35040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
35050 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
35060 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
35070 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
35080 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
35090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
350a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
350b0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
350c0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
350d0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
350e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
350f0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
35100 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
35110 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
35120 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
35130 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
35140 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
35150 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70   the doNotSyncSp
35160 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ill flag to 1. T
35170 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
35180 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
35190 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20     ** a journal 
351a0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
351b0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
351c0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
351d0 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   by.    ** this 
351e0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
351f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
35200 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
35210 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
35220 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  SyncSpill==0 );.
35230 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
35240 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20  tSyncSpill++;.. 
35250 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
35260 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
35270 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
35280 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
35290 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
352a0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
352b0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
352c0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
352d0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
352e0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
352f0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
35300 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
35310 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
35320 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
35330 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
35340 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
35350 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
35360 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
35370 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
35380 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
35390 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
353a0 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
353b0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
353c0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
353d0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
353e0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
353f0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
35400 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
35410 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
35420 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
35430 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
35440 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
35450 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
35460 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
35470 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
35480 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
35490 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
354a0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
354b0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
354c0 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
354d0 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
354e0 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
354f0 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
35500 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
35510 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
35520 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
35530 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
35540 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
35550 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35560 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35570 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
35580 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
35590 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
355a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
355b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
355c0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
355d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
355e0 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
355f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
35600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35610 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
35620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35640 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
35650 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
35670 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
35680 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
35690 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
356a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
356b0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
356c0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
356d0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
356e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
356f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
35700 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
35710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
35720 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
35730 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
35740 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
35750 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
35760 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
35770 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
35780 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
35790 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
357a0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
357b0 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
357c0 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
357d0 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
357e0 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
357f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
35800 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
35810 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
35820 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
35830 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
35840 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
35850 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
35860 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
35870 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
35880 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35890 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63  E_OK && needSync
358a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
358b0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
358c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
358d0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
358e0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
358f0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
35900 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
35910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
35920 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
35930 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
35940 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
35950 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
35960 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35970 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
35980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35990 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
359a0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
359b0 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l==1 );.    pPag
359c0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
359d0 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ll--;.  }else{. 
359e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
359f0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
35a00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
35a10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
35a20 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
35a30 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
35a40 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
35a50 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
35a60 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
35a70 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
35a80 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
35a90 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
35aa0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
35ab0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
35ac0 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
35ad0 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
35ae0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35af0 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
35b00 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
35b10 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
35b20 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Y;.}.#endif../*.
35b30 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
35b40 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
35b50 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
35b60 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
35b70 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
35b80 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
35b90 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
35ba0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
35bb0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
35bc0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
35bd0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
35be0 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
35bf0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
35c00 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73  .** the page has
35c10 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61   been added as a
35c20 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65   leaf of the fre
35c30 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73  elist and so its
35c40 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c  .** content no l
35c50 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a  onger matters..*
35c60 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
35c70 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
35c80 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
35c90 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
35ca0 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
35cb0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
35cc0 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61  s unused. The pa
35cd0 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
35ce0 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
35cf0 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
35d00 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
35d10 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
35d20 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
35d30 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
35d40 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68  can quadruple th
35d50 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
35d60 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72   .** DELETE oper
35d70 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ations..*/.void 
35d80 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
35d90 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  Write(PgHdr *pPg
35da0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
35db0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
35dc0 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  ;.  if( (pPg->fl
35dd0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
35de0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76   && pPager->nSav
35df0 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  epoint==0 ){.   
35e00 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f   PAGERTRACE(("DO
35e10 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
35e20 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
35e30 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
35e40 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54  ager)));.    IOT
35e50 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
35e60 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
35e70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70  Pg->pgno)).    p
35e80 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
35e90 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20  DR_DONT_WRITE;. 
35ea0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
35eb0 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
35ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
35ed0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
35ee0 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
35ef0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
35f00 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
35f10 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
35f20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
35f30 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
35f40 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
35f50 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
35f60 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
35f70 72 20 66 69 6c 65 2e 20 20 54 68 65 20 73 65 63  r file.  The sec
35f80 6f 6e 64 61 72 79 20 63 68 61 6e 67 65 20 63 6f  ondary change co
35f90 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32 20 69  unter at.** 92 i
35fa0 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2c 20  s also updated, 
35fb0 61 73 20 69 73 20 74 68 65 20 53 51 4c 69 74 65  as is the SQLite
35fc0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
35fd0 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
35fe0 0a 2a 2a 20 42 75 74 20 74 68 69 73 20 6f 6e 6c  .** But this onl
35ff0 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
36000 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
36010 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
36020 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20 61 76   false..** To av
36030 6f 69 64 20 65 78 63 65 73 73 20 63 68 75 72 6e  oid excess churn
36040 69 6e 67 20 6f 66 20 70 61 67 65 20 31 2c 20 74  ing of page 1, t
36050 68 65 20 75 70 64 61 74 65 20 6f 6e 6c 79 20 68  he update only h
36060 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a 2a 2a 20  appens once..** 
36070 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67  See also the pag
36080 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
36090 6f 75 6e 74 65 72 28 29 20 72 6f 75 74 69 6e 65  ounter() routine
360a0 20 74 68 61 74 20 64 6f 65 73 20 61 6e 20 0a 2a   that does an .*
360b0 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  * unconditional 
360c0 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68  update of the ch
360d0 61 6e 67 65 20 63 6f 75 6e 74 65 72 73 2e 0a 2a  ange counters..*
360e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
360f0 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73  rectMode flag is
36100 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
36110 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c   is done by call
36120 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
36130 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70  agerWrite() on p
36140 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69  age 1, then modi
36150 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
36160 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  ts of the.** pag
36170 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20  e data. In this 
36180 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69  case the file wi
36190 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68  ll be updated wh
361a0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
361b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
361c0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
361d0 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f  * The isDirectMo
361e0 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  de flag may only
361f0 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
36200 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
36210 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
36220 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
36230 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
36240 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
36250 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
36260 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
36270 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
36280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36290 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
362a0 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
362b0 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
362c0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
362d0 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
362e0 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
362f0 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
36300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36310 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
36320 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
36330 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
36340 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
36350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36360 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
36370 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36380 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
36390 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
363a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
363b0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
363c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
363d0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
363e0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
363f0 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e  * Declare and in
36400 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e  itialize constan
36410 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72  t integer 'isDir
36420 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a  ect'. If the.  *
36430 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
36440 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
36450 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  nabled in this b
36460 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72  uild, then isDir
36470 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74  ect.  ** is init
36480 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
36490 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
364a0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
364b0 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74  parameter.  ** t
364c0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
364d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
364e0 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
364f0 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
36500 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
36510 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   if the atomic-w
36520 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
36530 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e  n is not.  ** en
36540 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
36550 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69   time, the compi
36560 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65  ler can omit the
36570 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27   tests of.  ** '
36580 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c  isDirect' below,
36590 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
365a0 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69  block enclosed i
365b0 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20  n the.  ** "if( 
365c0 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64  isDirect )" cond
365d0 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ition..  */.#ifn
365e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
365f0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23  E_ATOMIC_WRITE.#
36600 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
36610 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20  ODE 0.  assert( 
36620 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
36630 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
36640 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
36650 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  de);.#else.# def
36660 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
36670 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e  isDirectMode.#en
36680 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61 67  dif..  if( !pPag
36690 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
366a0 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
366b0 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
366c0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
366e0 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
366f0 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  e 1 */..    asse
36700 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
36710 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
36720 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
36730 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
36740 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
36750 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
36760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36770 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
36780 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
36790 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
367a0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
367b0 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
367c0 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
367d0 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
367e0 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
367f0 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
36800 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
36810 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
36820 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
36830 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
36840 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
36850 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
36860 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
36870 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
36880 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
36890 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
368a0 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
368b0 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
368c0 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
368d0 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
368e0 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
368f0 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
36900 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
36910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36920 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
36930 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
36940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36950 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 74   ){.      /* Act
36960 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 75 70 64  ually do the upd
36970 61 74 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  ate of the chang
36980 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e counter */.   
36990 20 20 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63     pager_write_c
369a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 67  hangecounter(pPg
369b0 48 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Hdr);..      /* 
369c0 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
369d0 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
369e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
369f0 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
36a00 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
36a10 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b  ( DIRECT_MODE ){
36a20 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
36a30 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20 20  oid *zBuf;.     
36a40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36a50 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
36a60 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
36a70 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64 72  2(pPager, pPgHdr
36a80 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20 72  ->pData, 1, 6, r
36a90 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
36aa0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69  zBuf);.        i
36ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
36ad0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
36ae0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  e(pPager->fd, zB
36af0 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
36b00 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
36b10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
36b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36b30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
36b40 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
36b50 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
36b60 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
36b70 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
36b80 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
36b90 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
36ba0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
36bb0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
36bc0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
36bd0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
36be0 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
36bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36c00 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
36c10 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ase file to disk
36c20 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
36c30 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
36c40 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f 72 20  databases.** or 
36c50 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
36c60 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
36c70 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
36c80 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
36c90 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
36ca0 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
36cb0 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
36cc0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
36cd0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
36ce0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
36cf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
36d00 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
36d10 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
36d20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
36d30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36d40 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
36d50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
36d60 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
36d70 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  DB );.    rc = s
36d80 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
36d90 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
36da0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 7d  >syncFlags);.  }
36db0 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
36dc0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
36dd0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
36de0 42 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  B );.    sqlite3
36df0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
36e00 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
36e10 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54  _FCNTL_SYNC_OMIT
36e20 54 45 44 2c 20 28 76 6f 69 64 20 2a 29 26 72 63  TED, (void *)&rc
36e30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
36e40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
36e50 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
36e60 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
36e70 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ile a write-tran
36e80 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
36e90 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  e in.** rollback
36ea0 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  . If the connect
36eb0 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f  ion is in WAL mo
36ec0 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73  de, this call is
36ed0 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74   a no-op. .** Ot
36ee0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
36ef0 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20  connection does 
36f00 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61 76 65  not already have
36f10 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36f20 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
36f30 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20  tabase file, an 
36f40 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
36f50 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a  to obtain one..*
36f60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c  *.** If the EXCL
36f70 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c  USIVE lock is al
36f80 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68  ready held or th
36f90 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  e attempt to obt
36fa0 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63  ain it is.** suc
36fb0 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20  cessful, or the 
36fc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
36fd0 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54   WAL mode, SQLIT
36fe0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
36ff0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
37000 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55  either SQLITE_BU
37010 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  SY or an SQLITE_
37020 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
37030 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
37040 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
37050 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
37060 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  veLock(Pager *pP
37070 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37080 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
37090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
370a0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
370b0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20  TER_CACHEMOD .  
370c0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
370d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
370e0 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20  ITER_DBMOD .    
370f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37100 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37110 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a  ER_LOCKED .  );.
37120 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
37130 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37140 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d  ger) );.  if( 0=
37150 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  =pagerUseWal(pPa
37160 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
37170 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
37180 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
37190 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
371a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
371b0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
371c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
371d0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
371e0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
371f0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
37200 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
37210 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
37220 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
37230 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
37240 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
37250 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
37260 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
37270 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
37280 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
37290 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
372a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
372b0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
372c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
372d0 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ures that:.**.**
372e0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
372f0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
37300 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64  unter is updated
37310 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75  ,.**   * the jou
37320 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28  rnal is synced (
37330 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69  unless the atomi
37340 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
37350 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a  tion is used),.*
37360 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20  *   * all dirty 
37370 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
37380 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
37390 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20  e file, .**   * 
373a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
373b0 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28  e is truncated (
373c0 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e  if required), an
373d0 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  d.**   * the dat
373e0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
373f0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  d. .**.** The on
37400 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65  ly thing that re
37410 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
37420 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
37430 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a  is to finalize .
37440 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  ** (delete, trun
37450 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
37460 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20   first part of) 
37470 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37480 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20   (or .** delete 
37490 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
374a0 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
374b0 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
374c0 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
374d0 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
374e0 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
374f0 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
37500 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
37510 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
37520 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
37530 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  all..**.** If th
37540 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
37550 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
37560 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
37570 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
37580 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
37590 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
375a0 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
375b0 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
375c0 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
375d0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
375e0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
375f0 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
37600 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
37610 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
37620 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
37630 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37640 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
37650 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
37660 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
37670 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
37680 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
37690 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20  char *zMaster,  
376a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
376b0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61  not NULL, the ma
376c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
376d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e  e */.  int noSyn
376e0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
376f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
37700 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63  o omit the xSync
37710 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
37720 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
37730 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
37740 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
37750 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
37760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37770 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37780 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
37790 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
377a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
377b0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
377c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
377d0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
377e0 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
377f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37800 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
37810 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
37820 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37830 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  ager) );..  /* I
37840 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
37850 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74  occurred, report
37860 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69   that error agai
37870 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  n. */.  if( NEVE
37880 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
37890 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
378a0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
378b0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54  PAGERTRACE(("DAT
378c0 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
378d0 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
378e0 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  Size=%d\n", .   
378f0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
37900 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  name, zMaster, p
37910 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b  Pager->dbSize));
37920 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74  ..  /* If no dat
37930 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 68 61  abase changes ha
37940 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65  ve been made, re
37950 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
37960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
37970 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
37980 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75  _CACHEMOD ) retu
37990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
379a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
379b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
379c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
379d0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
379e0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
379f0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  o, or this.    *
37a00 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
37a10 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
37a20 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79  ed, it is mostly
37a30 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76   a no-op.  Howev
37a40 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62  er, any.    ** b
37a50 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73  ackup in progres
37a60 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
37a70 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  started..    */.
37a80 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
37a90 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
37aa0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
37ab0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65  se{.    if( page
37ac0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37ad0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
37ae0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
37af0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
37b00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
37b10 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
37b20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
37b30 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
37b40 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
37b50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
37b60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
37b70 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
37b80 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   ? pPager->syncF
37b90 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20  lags : 0).      
37ba0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
37bb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37bc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37bd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
37be0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
37bf0 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Cache);.      }.
37c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37c10 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
37c20 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
37c30 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
37c40 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
37c50 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  it.      ** does
37c60 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
37c70 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
37c80 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
37c90 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
37ca0 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62       ** was enab
37cb0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
37cc0 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
37cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
37ce0 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ts the .      **
37cf0 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
37d00 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
37d10 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a  ration: .      *
37d20 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20  *.      **    * 
37d30 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
37d40 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
37d50 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
37d60 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ty for.      ** 
37d70 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
37d80 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
37d90 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nd .      **    
37da0 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
37db0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
37dc0 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
37dd0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
37de0 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
37df0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
37e00 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
37e10 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
37e20 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
37e30 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
37e40 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
37e50 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
37e60 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
37e70 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
37e80 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
37e90 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
37ea0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
37eb0 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
37ec0 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20  change.      ** 
37ed0 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
37ee0 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
37ef0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
37f00 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
37f10 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  ut.      ** is n
37f20 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  ot applicable to
37f30 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
37f40 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a  n, call sqlite3J
37f50 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20  ournalCreate(). 
37f60 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20       ** to make 
37f70 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sure the journal
37f80 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c   file has actual
37f90 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  ly been created,
37fa0 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20   then call.     
37fb0 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
37fc0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
37fd0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
37fe0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
37ff0 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  ndirect.      **
38000 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a   mode. .      **
38010 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  .      ** Otherw
38020 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
38030 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
38040 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
38050 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  licable,.      *
38060 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
38070 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
38080 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
38090 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
380a0 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ter.      ** in 
380b0 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49  'direct' mode. I
380c0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
380d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
380e0 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20  l never be.     
380f0 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
38100 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
38110 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
38120 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
38130 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
38140 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
38150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
38160 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
38170 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
38180 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
38190 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
381a0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
381b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
381c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
381d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
381e0 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
381f0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
38200 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
38210 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
38220 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
38230 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
38240 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
38250 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
38260 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
38270 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20  er->dbOrigSize. 
38280 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50        && (0==(pP
38290 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
382a0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
382b0 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20  r->pPCache)) || 
382c0 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a  0==pPg->pDirty).
382d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
382e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
382f0 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
38300 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
38310 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
38320 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  d. The .        
38330 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
38340 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
38350 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
38360 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
38370 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
38380 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
38390 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
383a0 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
383b0 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
383c0 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
383d0 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
383e0 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
383f0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
38400 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ite .        ** 
38410 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
38420 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
38430 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
38440 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
38450 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
38460 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
38470 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
38480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
384a0 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
384b0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
384c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
384d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
384e0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
384f0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
38500 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
38510 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23     }.      }.  #
38520 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
38530 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
38540 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
38550 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
38560 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
38570 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
38580 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
38590 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
385a0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
385b0 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
385c0 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
385d0 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
385e0 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  s.      ** being
385f0 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
38600 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
38610 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
38620 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
38630 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
38640 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
38650 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
38660 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ode..      **.  
38670 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65      ** Before re
38680 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20  ading the pages 
38690 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
386a0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
386b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  e .      ** curr
386c0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
386d0 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
386e0 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
386f0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
38700 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
38710 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
38720 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
38730 74 68 65 72 77 69 73 65 2