/ Hex Artifact Content
Login

Artifact 6b3a7765ac98a32e125a7f0214fe65e9b578aac8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7350: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7360: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7370: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7380: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
7390: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
73a0: 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73   opertion.  Clas
73b0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
73c0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
73d0: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
73e0: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
73f0: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7400: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7410: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7420: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7430: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7440: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7450: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7460: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
7470: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
7480: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
7490: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
74a0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
74b0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
74c0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
74d0: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
74e0: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
74f0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7500: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7510: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7520: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7530: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7550: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7560: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
7570: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
7580: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
75a0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
75b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
75c0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
75d0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
75e0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
75f0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7600: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7610: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7630: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7640: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7650: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7660: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
7670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7680: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
7690: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
76a0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64  n-zero */.  u8 d
76b0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20  oNotSyncSpill;  
76c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
76d0: 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61  t do a spill tha
76e0: 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20  t requires jrnl 
76f0: 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62  sync */.  u8 sub
7700: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
7710: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7720: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
7730: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
7740: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7760: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7770: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7780: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
7790: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
77b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
77c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
77d0: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
77f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
7800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7810: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48  le */.  Pgno dbH
7820: 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  intSize;        
7830: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73      /* Value pas
7840: 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a  sed to FCNTL_SIZ
7850: 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20  E_HINT call */. 
7860: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7880: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
7890: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
78a0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
78d0: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
78e0: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
78f0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
7900: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
7910: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
7920: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
7930: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
7940: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
7970: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
7980: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7990: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
79a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
79b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
79c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
79d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
79e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
79f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7a00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7a10: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7a30: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7a40: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7a50: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a70: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7a80: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a90: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
7aa0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
7ac0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ad0: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
7ae0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7af0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
7b00: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
7b10: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
7b20: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
7b30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
7b40: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
7b50: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
7b60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
7b70: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
7b80: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
7b90: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
7ba0: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
7bb0: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
7bc0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
7bd0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
7c00: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
7c10: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
7c20: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7c30: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7c40: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7c50: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7c60: 0a 20 20 75 38 20 2a 61 46 69 6c 65 43 6f 6e 74  .  u8 *aFileCont
7c70: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ent;           /
7c80: 2a 20 46 69 6c 65 20 6d 61 70 70 65 64 20 69 6e  * File mapped in
7c90: 74 6f 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73  to memory */.  s
7ca0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 46 69  qlite3_int64 nFi
7cb0: 6c 65 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 42 79  leContent; /* By
7cc0: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6d 61  tes of memory ma
7cd0: 70 70 65 64 20 69 6e 74 6f 20 61 46 69 6c 65 43  pped into aFileC
7ce0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 76 6f 69 64  ontent */.  void
7cf0: 20 2a 70 4d 61 70 4f 62 6a 65 63 74 3b 20 20 20   *pMapObject;   
7d00: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
7d10: 74 6f 20 75 6e 6d 61 70 20 74 68 65 20 66 69 6c  to unmap the fil
7d20: 65 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  e */.  /*.  ** E
7d30: 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e  nd of the routin
7d40: 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61  ely-changing cla
7d50: 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a  ss members.  ***
7d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7da0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36  ********/..  u16
7db0: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
7dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
7dd0: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
7de0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
7df0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20  y page */.  i16 
7e00: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
7e10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7e20: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
7e30: 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68  s at end of each
7e40: 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76   page */.  u32 v
7e50: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
7e60: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
7e70: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
7e80: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32  xOpen() */.  u32
7e90: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
7ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
7eb0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
7ec0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
7ed0: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
7ee0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7ef0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
7f00: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
7f10: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f30: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
7f40: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
7f50: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20  tabase */.  i64 
7f60: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
7f70: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
7f80: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
7f90: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
7fa0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
7fb0: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
7fc0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7fd0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7fe0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
7ff0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
8000: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
8020: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
8030: 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f  ndler)(void*); /
8040: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
8050: 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a  ll when busy */.
8060: 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
8070: 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a  dlerArg;      /*
8080: 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e   Context argumen
8090: 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c  t for xBusyHandl
80a0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74  er */.  int nHit
80b0: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
80c0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63      /* Total cac
80d0: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
80e0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
80f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
8100: 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20  Read, nWrite;   
8110: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8120: 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72  se pages read/wr
8130: 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  itten */.#endif.
8140: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
8150: 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a  er)(DbPage*); /*
8160: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
8170: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
8180: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
8190: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
81a0: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
81b0: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
81c0: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
81d0: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
81e0: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
81f0: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
8200: 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
8210: 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66  t,int); /* Notif
8220: 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63  y of page size c
8230: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64  hanges */.  void
8240: 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
8250: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20  oid*);          
8260: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
8270: 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a   for the codec *
8280: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
8290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
82a0: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
82b0: 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d  t to xCodec... m
82c0: 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66  ethods */.#endif
82d0: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
82e0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
82f0: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
8300: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
8310: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
8320: 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65   PCache *pPCache
8330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8340: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
8350: 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cache object */.
8360: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8370: 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70  MIT_WAL.  Wal *p
8380: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8390: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61        /* Write-a
83a0: 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79  head log used by
83b0: 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77   "journal_mode=w
83c0: 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  al" */.  char *z
83d0: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
83e0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d       /* File nam
83f0: 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61  e for write-ahea
8400: 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a  d log */.#endif.
8410: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
8420: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
8430: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
8440: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
8450: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
8460: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
8470: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
8480: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
8490: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
84a0: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
84b0: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
84c0: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
84d0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
84e0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
84f0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
8500: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8510: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
8520: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
8530: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8540: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
8550: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
8560: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
8570: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
8580: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8590: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
85a0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
85b0: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
85c0: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
85d0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
85e0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
85f0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
8600: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
8610: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
8620: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
8630: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
8640: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
8650: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
8660: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
8670: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
8680: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
8690: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
86a0: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
86b0: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
86c0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
86d0: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
86e0: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
86f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8700: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
8710: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8720: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
8730: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
8740: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
8750: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
8760: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8770: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
8780: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
8790: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
87a0: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
87b0: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
87c0: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
87d0: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
87e0: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
87f0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
8800: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
8810: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8820: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
8830: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
8840: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
8850: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
8860: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8870: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
8880: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
8890: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
88a0: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
88b0: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
88c0: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
88d0: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
88e0: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
88f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
8900: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
8910: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
8920: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
8930: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
8940: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
8950: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
8960: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
8970: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
8980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
8990: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
89a0: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
89b0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
89c0: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
89d0: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
89e0: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
89f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
8a00: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
8a10: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
8a20: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
8a30: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
8a40: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
8a50: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
8a60: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
8a70: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
8a80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
8a90: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
8aa0: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
8ab0: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
8ac0: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
8ad0: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
8ae0: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
8af0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
8b00: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
8b10: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
8b20: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
8b30: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8b40: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
8b50: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
8b60: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
8b70: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
8b80: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
8b90: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8ba0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
8bb0: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
8bc0: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
8bd0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8be0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
8bf0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
8c00: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
8c10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
8c20: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
8c30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
8c40: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
8c50: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
8c60: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
8c70: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
8c80: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
8c90: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
8ca0: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
8cb0: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
8cc0: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
8cd0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
8ce0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
8cf0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
8d00: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
8d10: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
8d20: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
8d30: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
8d40: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
8d50: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
8d60: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
8d70: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
8d80: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
8d90: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
8da0: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
8db0: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
8dc0: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
8dd0: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
8de0: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
8df0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
8e00: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
8e10: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
8e20: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
8e30: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
8e40: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
8e50: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
8e60: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
8e70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
8e80: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
8e90: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68  483647../*.** Th
8ea0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
8eb0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
8ec0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
8ed0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
8ee0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
8ef0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
8f00: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
8f10: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
8f20: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
8f30: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
8f40: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
8f50: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
8f60: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
8f70: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
8f80: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
8f90: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
8fa0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
8fb0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
8fc0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
8fd0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
8fe0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ds)../*.** Retur
8ff0: 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 70  n true if this p
9000: 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69 74  ager uses a writ
9010: 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74  e-ahead log inst
9020: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
9030: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
9040: 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20  rnal. Otherwise 
9050: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  false..*/.#ifnde
9060: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
9070: 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  L.static int pag
9080: 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a  erUseWal(Pager *
9090: 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
90a0: 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21  n (pPager->pWal!
90b0: 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  =0);.}.#else.# d
90c0: 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61  efine pagerUseWa
90d0: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
90e0: 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
90f0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9100: 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c  agerWalFrames(v,
9110: 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66  w,x,y,z) 0.# def
9120: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
9130: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
9140: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
9150: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
9160: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
9170: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
9180: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9190: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
91a0: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
91b0: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
91c0: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
91d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
91e0: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
91f0: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9200: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
9210: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
9220: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
9230: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
9240: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
9250: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
9260: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9270: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9280: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9290: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
92a0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
92b0: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
92c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92d0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
92e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
92f0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9300: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
9310: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9320: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9330: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9340: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9350: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
9360: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9370: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9380: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9390: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
93a0: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
93b0: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
93c0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
93d0: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
93e0: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
93f0: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9400: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
9410: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
9420: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9430: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
9440: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
9450: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
9460: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9470: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9480: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9490: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
94a0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
94b0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
94c0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
94d0: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
94e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
94f0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9500: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
9510: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
9520: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
9530: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
9540: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
9550: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
9560: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9570: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9580: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9590: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
95a0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
95b0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
95c0: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
95d0: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
95e0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
95f0: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9600: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9610: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9620: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9630: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9640: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9650: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9660: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9670: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9680: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9690: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
96a0: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
96b0: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
96c0: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
96d0: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
96e0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
96f0: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9700: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9710: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9720: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9730: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9740: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9750: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9760: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9770: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9780: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9790: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
97a0: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
97b0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
97c0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
97d0: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
97e0: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
97f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9800: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9810: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9820: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9830: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9840: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9850: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
9860: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9870: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9880: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
9890: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
98a0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
98b0: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
98c0: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
98d0: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
98e0: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
98f0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9900: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9910: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9920: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9930: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9940: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9950: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9960: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9970: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
9980: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
9990: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
99a0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
99b0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
99c0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
99d0: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
99e0: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
99f0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9a00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9a10: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9a20: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9a30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9a40: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9a50: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
9a60: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
9a70: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
9a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9a90: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
9aa0: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
9ab0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9ac0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9ad0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9ae0: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9af0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9b00: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9b10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
9b20: 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a  ->noReadlock );.
9b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
9b40: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
9b50: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20  TER_LOCKED:.    
9b60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9b70: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9b80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9b90: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9ba0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9bb0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
9bc0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
9bd0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9be0: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
9bf0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
9c00: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
9c10: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
9c20: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  e==pPager->dbOri
9c30: 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  gSize );.      a
9c40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9c50: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
9c60: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
9c70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c80: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9c90: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
9ca0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  tSize );.      a
9cb0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
9cc0: 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
9cd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9ce0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9cf0: 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20  ER_CACHEMOD:.   
9d00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9d10: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
9d20: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9d30: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
9d40: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
9d50: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
9d60: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9d70: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ){.        /* It
9d80: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
9d90: 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  t if journal_mod
9da0: 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20  e=wal here that 
9db0: 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20  neither the.    
9dc0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
9dd0: 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20  ile nor the WAL 
9de0: 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54  file are open. T
9df0: 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69  his happens duri
9e00: 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ng.        ** a 
9e10: 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63  rollback transac
9e20: 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68  tion that switch
9e30: 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f  es from journal_
9e40: 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20  mode=off.       
9e50: 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d   ** to journal_m
9e60: 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20  ode=wal..       
9e70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
9e80: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  rt( p->eLock>=RE
9e90: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
9ea0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
9eb0: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20  sOpen(p->jfd) . 
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
9ed0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9ee0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ef0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
9f00: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9f10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9f20: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
9f30: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
9f40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9f50: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9f60: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9f70: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9f80: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9f90: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9fa0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
9fc0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
9fd0: 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20  TER_DBMOD:.     
9fe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ff0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
a000: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a010: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a020: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
a040: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a050: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  er) );.      ass
a060: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45  ert( p->eLock>=E
a070: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a090: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20  sOpen(p->jfd) . 
a0a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a0b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a0c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a0d0: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
a0e0: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a0f0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a100: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
a110: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a120: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a130: 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze<=pPager->dbHi
a140: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a150: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a160: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
a170: 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73  NISHED:.      as
a180: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  sert( p->eLock==
a190: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a1a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1b0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a1d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
a1e0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a1f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a200: 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29  ( isOpen(p->jfd)
a210: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a220: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a230: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a240: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a250: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a260: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a270: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a280: 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b    );.      break
a290: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a2a0: 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f  R_ERROR:.      /
a2b0: 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
a2c0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
a2d0: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
a2e0: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  ce to the pager 
a2f0: 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45  if.      ** in E
a300: 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
a310: 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20  rwise the pager 
a320: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
a330: 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20  ady dropped.    
a340: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45    ** back to OPE
a350: 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  N state..      *
a360: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a370: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
a380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a390: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a3a0: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
a3b0: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
a3c0: 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72  e)>0 );.      br
a3d0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
a3e0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
a3f0: 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  * ifndef NDEBUG 
a400: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a410: 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52  E_DEBUG ./*.** R
a420: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a430: 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61  to a human reada
a440: 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20  ble string in a 
a450: 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a  static buffer.**
a460: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
a470: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67  state of the Pag
a480: 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
a490: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
a4a0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65   This.** is inte
a4b0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
a4c0: 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73  within debuggers
a4d0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  . For example, a
a4e0: 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  s an alternative
a4f0: 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70  .** to "print *p
a500: 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a  Pager" in gdb:.*
a510: 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74  *.** (gdb) print
a520: 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61  f "%s", print_pa
a530: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
a540: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ).*/.static char
a550: 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74   *print_pager_st
a560: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
a570: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65   static char zRe
a580: 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69  t[1024];..  sqli
a590: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32  te3_snprintf(102
a5a0: 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22  4, zRet,.      "
a5b0: 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25  Filename:      %
a5c0: 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74  s\n".      "Stat
a5d0: 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72  e:         %s er
a5e0: 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20  rCode=%d\n".    
a5f0: 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20    "Lock:        
a600: 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c    %s\n".      "L
a610: 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f  ocking mode:  lo
a620: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22  cking_mode=%s\n"
a630: 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20  .      "Journal 
a640: 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d  mode:  journal_m
a650: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
a660: 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20  "Backing store: 
a670: 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44  tempFile=%d memD
a680: 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d  b=%d useJournal=
a690: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75  %d\n".      "Jou
a6a0: 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72  rnal:       jour
a6b0: 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72  nalOff=%lld jour
a6c0: 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20  nalHdr=%lld\n". 
a6d0: 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20       "Size:     
a6e0: 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64       dbsize=%d d
a6f0: 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46  bOrigSize=%d dbF
a700: 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20  ileSize=%d\n".  
a710: 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61      , p->zFilena
a720: 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53  me.      , p->eS
a730: 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
a740: 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f              ? "O
a750: 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70  PEN" :.        p
a760: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a770: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
a780: 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20  ? "READER" :.   
a790: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a7a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
a7b0: 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f  KED   ? "WRITER_
a7c0: 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20  LOCKED" :.      
a7d0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
a7e0: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
a7f0: 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43  OD ? "WRITER_CAC
a800: 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20  HEMOD" :.       
a810: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a820: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
a830: 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f    ? "WRITER_DBMO
a840: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a850: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a860: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20  ITER_FINISHED ? 
a870: 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  "WRITER_FINISHED
a880: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a890: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
a8a0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  OR           ? "
a8b0: 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72  ERROR" : "?error
a8c0: 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  ?".      , (int)
a8d0: 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  p->errCode.     
a8e0: 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f   , p->eLock==NO_
a8f0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22  LOCK         ? "
a900: 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20  NO_LOCK" :.     
a910: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53     p->eLock==RES
a920: 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22  ERVED_LOCK   ? "
a930: 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20  RESERVED" :.    
a940: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58      p->eLock==EX
a950: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20  CLUSIVE_LOCK  ? 
a960: 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20  "EXCLUSIVE" :.  
a970: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
a980: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
a990: 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20  ? "SHARED" :.   
a9a0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55       p->eLock==U
a9b0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f  NKNOWN_LOCK    ?
a9c0: 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65   "UNKNOWN" : "?e
a9d0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70  rror?".      , p
a9e0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
a9f0: 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20  ? "exclusive" : 
aa00: 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c  "normal".      ,
aa10: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
aa20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
aa30: 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d  DE_MEMORY   ? "m
aa40: 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20  emory" :.       
aa50: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
aa60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
aa70: 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f  DE_OFF      ? "o
aa80: 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ff" :.        p-
aa90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
aaa0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
aab0: 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65  DELETE   ? "dele
aac0: 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  te" :.        p-
aad0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
aae0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
aaf0: 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73  PERSIST  ? "pers
ab00: 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ist" :.        p
ab10: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab20: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ab30: 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75  _TRUNCATE ? "tru
ab40: 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20  ncate" :.       
ab50: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
ab60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ab70: 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77  DE_WAL      ? "w
ab80: 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  al" : "?error?".
ab90: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
aba0: 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70  tempFile, (int)p
abb0: 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d  ->memDb, (int)p-
abc0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
abd0: 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66    , p->journalOf
abe0: 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  f, p->journalHdr
abf0: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
ac00: 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  >dbSize, (int)p-
ac10: 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e  >dbOrigSize, (in
ac20: 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  t)p->dbFileSize.
ac30: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a    );..  return z
ac40: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  Ret;.}.#endif../
ac50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
ac60: 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73   if it is necess
ac70: 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67  ary to write pag
ac80: 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20  e *pPg into the 
ac90: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  sub-journal..** 
aca0: 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  A page needs to 
acb0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
acc0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
acd0: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
ace0: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f  one.** or more o
acf0: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66  pen savepoints f
ad00: 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20  or which:.**.** 
ad10: 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d    * The page-num
ad20: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
ad30: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67   or equal to Pag
ad40: 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69  erSavepoint.nOri
ad50: 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  g, and.**   * Th
ad60: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
ad70: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ing to the page-
ad80: 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65  number is not se
ad90: 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65  t in.**     Page
ada0: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
adb0: 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  vepoint..*/.stat
adc0: 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69  ic int subjRequi
add0: 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70  resPage(PgHdr *p
ade0: 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  Pg){.  Pgno pgno
adf0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
ae00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
ae10: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
ae20: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
ae30: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
ae40: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
ae50: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
ae60: 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
ae70: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
ae80: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
ae90: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
aea0: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
aeb0: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
aec0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
aed0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
aee0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
aef0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
af00: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
af10: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
af20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
af30: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
af40: 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  nJournal(PgHdr *
af50: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
af60: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
af70: 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49  (pPg->pPager->pI
af80: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
af90: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
afa0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
afb0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
afc0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
afd0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
afe0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
aff0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b000: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b010: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b020: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b030: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b040: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b050: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b060: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b070: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b080: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b090: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b0a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b0b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b0c0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b0d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b0e0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b0f0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b100: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b110: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b120: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b130: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b140: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b150: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b160: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b170: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b180: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b190: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b1a0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b1b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b1c0: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b1d0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b1e0: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b1f0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b200: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b210: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b220: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b230: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b240: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b250: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b260: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b280: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b290: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b2a0: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b2b0: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b2c0: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b2d0: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b2e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b2f0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b310: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b320: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b330: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b340: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b350: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b360: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b370: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b380: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b390: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b3a0: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b3b0: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b3c0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b3d0: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b3e0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b3f0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b400: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b410: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b420: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b430: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b440: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b450: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b460: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b470: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b480: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b490: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b4a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b4b0: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b4c0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b4d0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b4e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b4f0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b500: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b510: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b520: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b530: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b540: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b550: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b560: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b570: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b580: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b590: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b5a0: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b5b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b5c0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b5d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b5e0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b5f0: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
b600: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b610: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
b620: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b630: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
b640: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  ck;.    }.    IO
b650: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
b660: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
b670: 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72   eLock)).  }.  r
b680: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b690: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61  ** Lock the data
b6a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b6b0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b6c0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
b6d0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52  HARED_LOCK,.** R
b6e0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
b6f0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
b700: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
b710: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
b720: 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c   the.** Pager.eL
b730: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b740: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
b750: 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  state. .**.** Ex
b760: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
b770: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
b780: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
b790: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b7a0: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  s .** called, do
b7b0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75   not modify it u
b7c0: 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f  nless the new lo
b7d0: 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45  cking state is E
b7e0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a  XCLUSIVE_LOCK. .
b7f0: 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  ** See the comme
b800: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b810: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
b820: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
b830: 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74  anation .** of t
b840: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b850: 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50  nt pagerLockDb(P
b860: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b870: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b880: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b890: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b8a0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
b8b0: 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44   eLock==RESERVED
b8c0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b8d0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
b8e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b8f0: 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70  eLock<eLock || p
b900: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
b910: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
b920: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b930: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
b940: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
b950: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b960: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
b970: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
b980: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b990: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
b9a0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b9b0: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
b9c0: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
b9d0: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b9e0: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
b9f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ba00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
ba10: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
ba20: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
ba30: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
ba40: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
ba50: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
ba60: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
ba70: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
ba80: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
ba90: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
baa0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
bab0: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
bac0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
bad0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
bae0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
baf0: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
bb00: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
bb10: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
bb20: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
bb30: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
bb40: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
bb50: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
bb60: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
bb70: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
bb80: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
bb90: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
bba0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
bbb0: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
bbc0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
bbd0: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
bbe0: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
bbf0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
bc00: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
bc10: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
bc20: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
bc30: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
bc40: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
bc50: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
bc60: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
bc70: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
bc80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bc90: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
bca0: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
bcb0: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
bcc0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
bcd0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
bce0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
bcf0: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
bd00: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
bd10: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
bd20: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
bd30: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
bd40: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
bd50: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd70: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
bd80: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
bd90: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
bdc0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
bdd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bdf0: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
be00: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
be10: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
be20: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
be30: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
be40: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
be50: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
be60: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
be70: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
be80: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
be90: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
bea0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
beb0: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
bec0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bed0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
bee0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
bef0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
bf00: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
bf10: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
bf20: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
bf30: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
bf40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
bf50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
bf60: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
bf70: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
bf80: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
bf90: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
bfa0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
bfb0: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
bfc0: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
bfd0: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
bfe0: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
bff0: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
c000: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
c010: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
c020: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
c030: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
c040: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c050: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
c060: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
c070: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
c080: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
c090: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
c0a0: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
c0b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c0c0: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
c0d0: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
c0e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
c0f0: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
c100: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
c110: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
c120: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
c130: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
c140: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
c150: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
c160: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
c170: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
c180: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
c190: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
c1a0: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
c1b0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
c1c0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
c1d0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
c1e0: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
c1f0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c200: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
c210: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
c220: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
c230: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
c240: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
c250: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
c260: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
c270: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
c280: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
c290: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
c2a0: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
c2b0: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
c2c0: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
c2d0: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
c2e0: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
c2f0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
c300: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
c310: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
c320: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
c330: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
c340: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
c350: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
c360: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
c370: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
c380: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
c390: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
c3a0: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
c3b0: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
c3c0: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
c3d0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
c3e0: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
c3f0: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
c400: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
c410: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
c420: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
c430: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
c440: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
c450: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c460: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
c470: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
c480: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c490: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
c4a0: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
c4b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c4c0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
c4d0: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
c4e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
c4f0: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
c500: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
c510: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
c520: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
c530: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
c540: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
c550: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
c560: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
c570: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
c580: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
c590: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
c5a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c5b0: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
c5c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
c5d0: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
c5e0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
c5f0: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
c600: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
c610: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
c620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
c630: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
c640: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
c650: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
c660: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
c670: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
c680: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c690: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
c6a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c6b0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
c6c0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
c6d0: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
c6e0: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
c6f0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
c700: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
c710: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
c720: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
c730: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
c740: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
c750: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
c760: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c770: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
c780: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
c790: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
c7a0: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
c7b0: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
c7c0: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
c7d0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
c7e0: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
c7f0: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
c800: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
c810: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
c820: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
c830: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
c840: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
c850: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
c860: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
c870: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
c880: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
c890: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
c8a0: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
c8b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
c8c0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c8d0: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
c8e0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c8f0: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
c900: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
c910: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
c920: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
c930: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
c940: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
c950: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
c960: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
c970: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
c980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c990: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c9a0: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
c9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
c9c0: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
c9d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c9e0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
c9f0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
ca00: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
ca10: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
ca20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
ca30: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
ca40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca50: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
ca60: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
ca70: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
ca80: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
ca90: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
caa0: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
cab0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
cac0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
cad0: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
cae0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
caf0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
cb00: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
cb10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
cb20: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cb30: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
cb40: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
cb50: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
cb60: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
cb70: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
cb80: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
cb90: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
cba0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
cbb0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
cbc0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
cbd0: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
cbe0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cbf0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
cc00: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
cc10: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
cc20: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
cc30: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
cc40: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
cc50: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cc60: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
cc70: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
cc80: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
cc90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
cca0: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
ccb0: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
ccc0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ccd0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
cce0: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
ccf0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
cd00: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
cd10: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
cd20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
cd30: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
cd40: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
cd50: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
cd60: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
cd70: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
cd80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cd90: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
cda0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
cdb0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
cdc0: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
cdd0: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
cde0: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
cdf0: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
ce00: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
ce10: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
ce20: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
ce30: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
ce40: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
ce50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ce60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
ce70: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
ce80: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
ce90: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
cea0: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
ceb0: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
cec0: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
ced0: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
cee0: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
cef0: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
cf00: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
cf10: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
cf20: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
cf30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
cf40: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
cf50: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
cf60: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
cf90: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
cfb0: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
cfd0: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
d020: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
d030: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
d040: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
d050: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
d060: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
d070: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
d080: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
d090: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
d0a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d0b0: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
d0c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
d0d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
d0e0: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
d0f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
d100: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
d110: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
d120: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
d130: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d140: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
d150: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
d160: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
d170: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
d180: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d190: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
d1a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d1b0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
d1c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d1d0: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
d1e0: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
d1f0: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
d200: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
d210: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
d220: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
d230: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
d240: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
d250: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
d260: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
d270: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
d280: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d290: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d2a0: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
d2b0: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
d2c0: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
d2d0: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
d2e0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
d2f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
d300: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
d310: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
d320: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
d330: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
d340: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d350: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
d360: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
d370: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
d380: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
d390: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
d3a0: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
d3b0: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
d3c0: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
d3d0: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
d3e0: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
d3f0: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
d400: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d410: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d420: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
d430: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
d440: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
d450: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
d460: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
d470: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d480: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
d490: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
d4a0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
d4b0: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
d4c0: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
d4d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
d4e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
d4f0: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d500: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d510: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
d520: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
d530: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
d540: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
d550: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
d560: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
d570: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
d580: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d5c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
d5d0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
d5e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
d5f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
d600: 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69     const i64 iLi
d610: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
d620: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
d630: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d640: 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20  e of jsl */..   
d650: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
d660: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
d670: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
d680: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
d690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
d6a0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
d6b0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
d6c0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
d6d0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
d6e0: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
d6f0: 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20  28] = {0};.     
d700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
d710: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
d720: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
d730: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
d740: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
d750: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
d760: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d770: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d780: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
d790: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
d7a0: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
d7b0: 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
d7c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
d7d0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
d7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
d7f0: 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68  committed but th
d800: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20  e write lock .  
d810: 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65    ** is still he
d820: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ld on the file. 
d830: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69  If there is a si
d840: 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75  ze limit configu
d850: 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  red for .    ** 
d860: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a  the persistent j
d870: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a  ournal and the j
d880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
d890: 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d  ently consumes m
d8a0: 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  ore.    ** space
d8b0: 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74   than that limit
d8c0: 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75   allows for, tru
d8d0: 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ncate it now. Th
d8e0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
d8f0: 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68     ** to sync th
d900: 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67  e file following
d910: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
d920: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d930: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d940: 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20   iLimit>0 ){.   
d950: 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20     i64 sz;.     
d960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
d970: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
d980: 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  jfd, &sz);.     
d990: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d9a0: 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20  OK && sz>iLimit 
d9b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d9c0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d9d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  e(pPager->jfd, i
d9e0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
d9f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
da00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
da10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
da20: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
da30: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
da40: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
da50: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
da60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
da70: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
da80: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
da90: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
daa0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
dab0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
dac0: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
dad0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
dae0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
daf0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
db00: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
db10: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
db20: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
db30: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
db40: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
db50: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
db60: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
db70: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
db80: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
db90: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
dba0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
dbb0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
dbc0: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
dbd0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
dbe0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
dbf0: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
dc00: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dc10: 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  Database page si
dc20: 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  ze..** .** Follo
dc30: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
dc40: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
dc50: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
dc60: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
dc70: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
dc80: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
dc90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
dca0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
dcb0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
dcc0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n code */.  char
dcd0: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
dce0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
dcf0: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61  /* Temporary spa
dd00: 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ce used to build
dd10: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
dd20: 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32 29   nHeader = (u32)
dd30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
dd40: 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66  ;/* Size of buff
dd50: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
dd60: 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33   zHeader */.  u3
dd70: 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  2 nWrite;       
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65    /* Bytes of he
dda0: 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74  ader sector writ
ddb0: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ten */.  int ii;
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dde0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
ddf0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
de00: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
de10: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
de20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
de30: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  pen. */..  if( n
de40: 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48  Header>JOURNAL_H
de50: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
de60: 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a  .    nHeader = J
de70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
de80: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
de90: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
dea0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
deb0: 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  and any of them 
dec0: 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20  were created .  
ded0: 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73  ** since the mos
dee0: 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c  t recent journal
def0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
df00: 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20  ten, update the 
df10: 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
df20: 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
df30: 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f  fields now..  */
df40: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
df50: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
df60: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  nt; ii++){.    i
df70: 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  f( pPager->aSave
df80: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
df90: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
dfa0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
dfb0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
dfc0: 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
dfd0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
dfe0: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
dff0: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
e000: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
e010: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
e020: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
e030: 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20  .  ** Write the 
e040: 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65  nRec Field - the
e050: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
e060: 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c  records that fol
e070: 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f  low this.  ** jo
e080: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f  urnal header. No
e090: 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20  rmally, zero is 
e0a0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
e0b0: 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69  value at this ti
e0c0: 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74  me..  ** After t
e0d0: 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61  he records are a
e0e0: 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  dded to the jour
e0f0: 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75  nal (and the jou
e100: 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20  rnal synced, .  
e110: 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79  ** if in full-sy
e120: 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65  nc mode), the ze
e130: 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ro is overwritte
e140: 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20  n with the true 
e150: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72  number.  ** of r
e160: 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63  ecords (see sync
e170: 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a  Journal())..  **
e180: 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61  .  ** A faster a
e190: 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f  lternative is to
e1a0: 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46   write 0xFFFFFFF
e1b0: 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69  F to the nRec fi
e1c0: 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72  eld. When.  ** r
e1d0: 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eading the journ
e1e0: 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65  al this value te
e1f0: 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73  lls SQLite to as
e200: 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20  sume that the.  
e210: 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  ** rest of the j
e220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
e230: 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20  ains valid page 
e240: 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73  records. This as
e250: 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  sumption.  ** is
e260: 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69   dangerous, as i
e270: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
e280: 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  rred whilst writ
e290: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
e2a0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
e2b0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
e2c0: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
e2d0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
e2e0: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
e2f0: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
e300: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
e310: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
e320: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
e330: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
e340: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
e350: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
e360: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
e370: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
e380: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
e390: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
e3a0: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e3b0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
e3c0: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
e3d0: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
e3e0: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
e3f0: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
e400: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
e410: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
e420: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
e430: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ) || pPager->noS
e440: 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ync );.  if( pPa
e450: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
e460: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
e470: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
e480: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
e490: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
e4a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
e4b0: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
e4c0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
e4d0: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
e4e0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
e4f0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
e500: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
e510: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
e520: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e530: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e540: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
e550: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
e560: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61  .    memset(zHea
e570: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  der, 0, sizeof(a
e580: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29  JournalMagic)+4)
e590: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
e5a0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
e5b0: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
e5c0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
e5d0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
e5e0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
e5f0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
e600: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
e610: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e620: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e630: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
e640: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
e650: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
e660: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
e670: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e680: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e690: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
e6a0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
e6b0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
e6c0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
e6d0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
e6e0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e6f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e700: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
e710: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
e720: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
e730: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
e740: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e750: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e760: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
e770: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
e790: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
e7a0: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
e7b0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
e7c0: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
e7d0: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
e7e0: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
e7f0: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
e800: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
e810: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
e820: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
e830: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
e840: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
e850: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
e860: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
e870: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
e880: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
e890: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e8a0: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
e8b0: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
e8c0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e8d0: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
e8e0: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
e8f0: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
e900: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
e910: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
e920: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e930: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
e940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e950: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
e960: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
e970: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
e980: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
e990: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
e9a0: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
e9b0: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
e9c0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
e9d0: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
e9e0: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
e9f0: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
ea00: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
ea10: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
ea20: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
ea30: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
ea40: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
ea50: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
ea60: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
ea70: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
ea80: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
ea90: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
eaa0: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
eab0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
eac0: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
ead0: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
eae0: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
eaf0: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
eb00: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
eb10: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
eb20: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
eb30: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
eb40: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
eb50: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
eb60: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
eb70: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
eb80: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
eb90: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
eba0: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
ebb0: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
ebc0: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
ebd0: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
ebe0: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
ebf0: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
ec00: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
ec10: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
ec20: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
ec30: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
ec40: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
ec50: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
ec60: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
ec70: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
ec80: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
ec90: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
eca0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ecb0: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
ecc0: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
ecd0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
ece0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
ecf0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
ed00: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
ed10: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
ed20: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
ed30: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
ed40: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
ed50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
ed60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ed70: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
ed80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ed90: 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ff );.    pPager
eda0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
edb0: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
edc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
edd0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
ede0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
edf0: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
ee00: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
ee10: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
ee20: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
ee30: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
ee40: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
ee50: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
ee60: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
ee70: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
ee80: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
ee90: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
eea0: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
eeb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
eec0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
eed0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
eee0: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
eef0: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
ef00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
ef10: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
ef20: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
ef30: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
ef40: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
ef50: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
ef60: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
ef70: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
ef80: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
ef90: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
efa0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
efb0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
efc0: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
efd0: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
efe0: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
eff0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
f000: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
f010: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
f020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f030: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
f040: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
f050: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
f060: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
f070: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
f080: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
f090: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
f0a0: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
f0b0: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
f0c0: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
f0d0: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
f0e0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
f0f0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
f100: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
f110: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
f120: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
f130: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
f140: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
f150: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
f160: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
f170: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
f180: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c   */.  int isHot,
f190: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
f1a0: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
f1b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
f1c0: 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
f1d0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
f1e0: 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20  32 *pNRec,      
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f200: 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
f210: 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65  rom the nRec fie
f220: 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62  ld */.  u32 *pDb
f230: 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
f240: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
f250: 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64  ue of original d
f260: 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65  atabase size fie
f270: 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ld */.){.  int r
f280: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f290: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
f2a0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69  n code */.  unsi
f2b0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
f2c0: 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75  [8];     /* A bu
f2d0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
f2e0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
f2f0: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75  /* Offset of jou
f320: 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e  rnal header bein
f330: 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  g read */..  ass
f340: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
f350: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
f360: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
f370: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
f380: 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  /..  /* Advance 
f390: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
f3a0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
f3b0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
f3c0: 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  . If the.  ** jo
f3d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f  urnal file is to
f3e0: 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72  o small for ther
f3f0: 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72  e to be a header
f400: 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a   stored at this.
f410: 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75    ** point, retu
f420: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
f430: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
f440: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
f450: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
f460: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
f470: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
f480: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
f490: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
f4a0: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
f4b0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
f4c0: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
f4d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f4e0: 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  f;..  /* Read in
f4f0: 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74   the first 8 byt
f500: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
f510: 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65  l header. If the
f520: 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20  y do not match. 
f530: 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73   ** the  magic s
f540: 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74  tring found at t
f550: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
f560: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
f570: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
f580: 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20  ITE_DONE. If an 
f590: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
f5a0: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
f5b0: 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
f5c0: 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  ,.  ** proceed..
f5d0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74    */.  if( isHot
f5e0: 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61   || iHdrOff!=pPa
f5f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
f600: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
f610: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
f620: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
f630: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69  izeof(aMagic), i
f640: 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28  HdrOff);.    if(
f650: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
f660: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
f670: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
f680: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
f690: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
f6a0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  c))!=0 ){.      
f6b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
f6c0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
f6d0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72   /* Read the fir
f6e0: 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20  st three 32-bit 
f6f0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f  fields of the jo
f700: 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68  urnal header: Th
f710: 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c  e nRec.  ** fiel
f720: 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d  d, the checksum-
f730: 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20  initializer and 
f740: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
f750: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20  e at the start. 
f760: 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73   ** of the trans
f770: 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61  action. Return a
f780: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
f790: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
f7a0: 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ong..  */.  if( 
f7b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f7c0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f7d0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f7e0: 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c  +8, pNRec)).   |
f7f0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
f800: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f810: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f820: 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e  ff+12, &pPager->
f830: 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c  cksumInit)).   |
f840: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
f850: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f860: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f870: 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29  ff+16, pDbSize))
f880: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
f890: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
f8a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f8b0: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ff==0 ){.    u32
f8c0: 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20   iPageSize;     
f8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
f8e0: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
f8f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
f900: 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f  /.    u32 iSecto
f910: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
f920: 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a     /* Sector-siz
f930: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
f940: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  al header */..  
f950: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
f960: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
f970: 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20  or-size journal 
f980: 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a  header fields. *
f990: 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  /.    if( SQLITE
f9a0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
f9b0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
f9c0: 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26  d, iHdrOff+20, &
f9d0: 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20  iSectorSize)).  
f9e0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
f9f0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
fa00: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
fa10: 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67  HdrOff+24, &iPag
fa20: 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20  eSize)).    ){. 
fa30: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fa40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65      }..    /* Ve
fa50: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
fa60: 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20   prior to 3.5.8 
fa70: 73 65 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  set the page-siz
fa80: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20  e field of the. 
fa90: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65     ** journal he
faa0: 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  ader to zero. In
fab0: 20 74 68 69 73 20 63 61 73 65 2c 20 61 73 73 75   this case, assu
fac0: 6d 65 20 74 68 61 74 20 74 68 65 20 50 61 67 65  me that the Page
fad0: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a  r.pageSize.    *
fae0: 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  * variable is al
faf0: 72 65 61 64 79 20 73 65 74 20 74 6f 20 74 68 65  ready set to the
fb00: 20 63 6f 72 72 65 63 74 20 70 61 67 65 20 73 69   correct page si
fb10: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
fb20: 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20  f( iPageSize==0 
fb30: 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53 69  ){.      iPageSi
fb40: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
fb50: 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  eSize;.    }..  
fb60: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
fb70: 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20  the values read 
fb80: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69  from the page-si
fb90: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
fba0: 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a  ze fields.    **
fbb0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
fbc0: 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e  e. To be 'in ran
fbd0: 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ge', both values
fbe0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f   need to be a po
fbf0: 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77  wer.    ** of tw
fc00: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
fc10: 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f  r equal to 512 o
fc20: 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72  r 32, and not gr
fc30: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
fc40: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
fc50: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
fc60: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
fc70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fc80: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
fca0: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32  | iSectorSize<32
fcb0: 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69  .     || iPageSi
fcc0: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
fcd0: 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74  GE_SIZE || iSect
fce0: 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
fcf0: 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28  R_SIZE.     || (
fd00: 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50  (iPageSize-1)&iP
fd10: 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c  ageSize)!=0   ||
fd20: 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31   ((iSectorSize-1
fd30: 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d  )&iSectorSize)!=
fd40: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
fd50: 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65 72  /* If the either
fd60: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
fd70: 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  r sector-size in
fd80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
fd90: 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  der is .      **
fda0: 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74   invalid, then t
fdb0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
fdc0: 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  wrote the journa
fdd0: 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68 61  l-header must ha
fde0: 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61  ve .      ** cra
fdf0: 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  shed before the 
fe00: 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63 65  header was synce
fe10: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
fe20: 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20  stop reading .  
fe30: 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
fe40: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20  al file here..  
fe50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
fe60: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fe70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
fe80: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d 73  pdate the page-s
fe90: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
fea0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
feb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20   the journal. . 
fec0: 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74     ** Use a test
fed0: 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20  case() macro to 
fee0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d  make sure that m
fef0: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69  alloc failure wi
ff00: 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67  thin .    ** Pag
ff10: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
ff20: 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a  is tested..    *
ff30: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
ff40: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
ff50: 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61 67  ze(pPager, &iPag
ff60: 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20  eSize, -1);.    
ff70: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
ff80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
ff90: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
ffa0: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
ffb0: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
ffc0: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
ffd0: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
ffe0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
fff0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
10000 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
10010 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62      ** created b
10020 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
10030 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
10040 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
10050 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69  ne.    ** is bei
10060 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
10070 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
10080 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
10090 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  l value.    ** o
100a0 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
100b0 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
100c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
100d0 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a  t routine..    *
100e0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
100f0 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74  ctorSize = iSect
10100 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70  orSize;.  }..  p
10110 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10120 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
10130 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
10140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
10150 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
10160 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
10170 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
10180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10190 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
101a0 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
101b0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
101c0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
101d0 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
101e0 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
101f0 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
10200 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
10210 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
10220 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
10230 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
10240 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
10250 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
10260 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
10270 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
10280 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
10290 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
102a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62  s:.**.**   + 4 b
102b0 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
102c0 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79  GNO..**   + N by
102d0 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
102e0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nal filename in 
102f0 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20  utf-8..**   + 4 
10300 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68  bytes: N (length
10310 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
10320 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  al name in bytes
10330 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  , no nul-termina
10340 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tor)..**   + 4 b
10350 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
10360 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
10370 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74  um..**   + 8 byt
10380 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
10390 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
103a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
103b0 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
103c0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
103d0 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
103e0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
103f0 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79  e, where each by
10400 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
10410 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d  d as a signed 8-
10420 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  bit integer..**.
10430 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73  ** If zMaster is
10440 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
10450 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69  (occurs for a si
10460 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
10470 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20  ansaction), .** 
10480 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
10490 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
104a0 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a  int writeMasterJ
104b0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
104c0 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
104d0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
104e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10500 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10510 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20  .  int nMaster; 
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
10540 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10550 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
10560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10570 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
10580 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75  of header in jou
10590 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
105a0 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20  64 jrnlSize;    
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
105d0 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  al file on disk 
105e0 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  */.  u32 cksum =
105f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10600 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
10610 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73  m of string zMas
10620 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
10630 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  ( pPager->setMas
10640 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ter==0 );.  asse
10650 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
10660 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
10670 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20  f( !zMaster .   
10680 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
10690 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
106a0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
106b0 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
106c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
106d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
106e0 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
106f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10700 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
10710 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
10720 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
10730 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
10740 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10750 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10760 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10770 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10780 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10790 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
107a0 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
107b0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
107c0 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
107d0 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
107e0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
107f0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10800 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10810 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10820 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10830 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10840 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10850 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10860 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10870 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10880 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10890 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
108a0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
108b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
108c0 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
108d0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
108e0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
108f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10900 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10910 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10920 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10930 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10940 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10950 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10960 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10980 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10990 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
109a0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
109b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
109c0 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
109d0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
109e0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
109f0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10a00 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10a10 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10a20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10a30 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10a40 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10a50 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10a60 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10a70 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a80 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a90 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10aa0 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10ab0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10ac0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10ad0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10ae0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10af0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10b00 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10b10 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10b20 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10b30 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10b40 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
10b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10b60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10b70 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
10b80 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
10b90 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
10ba0 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
10bb0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
10bc0 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
10bd0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
10be0 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
10bf0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
10c00 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
10c10 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
10c20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
10c30 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
10c40 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
10c50 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
10c60 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
10c70 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
10c80 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
10c90 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
10ca0 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
10cb0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10cc0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
10cd0 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
10ce0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
10cf0 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
10d00 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
10d10 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
10d20 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
10d30 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
10d40 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
10d50 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
10d60 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
10d70 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
10d80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
10d90 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
10da0 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
10db0 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
10dc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10dd0 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
10de0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
10df0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
10e00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10e10 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
10e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
10e30 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
10e40 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
10e50 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
10e60 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  r. Return.** a p
10e70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
10e80 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ge or NULL if th
10e90 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
10ea0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65   is not .** alre
10eb0 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ady in memory..*
10ec0 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
10ed0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
10ee0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
10ef0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
10f00 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
10f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10f20 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
10f30 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
10f40 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61  ossible for a ca
10f50 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63  ll to PcacheFetc
10f60 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46  h() with createF
10f70 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66  lag==0 to.  ** f
10f80 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74  ail, since no at
10f90 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
10fa0 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  e dynamic memory
10fb0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20   will be made.. 
10fc0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
10fd0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
10fe0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
10ff0 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
11000 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
11010 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
11020 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
11030 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
11040 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
11050 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11060 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
11070 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
11080 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
11090 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
110a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
110b0 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
110c0 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
110d0 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
110e0 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
110f0 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11100 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11110 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11120 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
11130 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
11140 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
11150 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
11160 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
11170 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11180 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
111a0 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
111b0 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
111c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111e0 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
111f0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
11200 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
11210 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
11220 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11230 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11240 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11250 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
11260 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
11270 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
11280 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11290 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
112a0 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
112b0 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
112c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
112d0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
112e0 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
112f0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
11300 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
11310 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11320 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
11330 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
11340 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
11350 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
11360 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
11370 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
11380 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
11390 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
113a0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
113b0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
113c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
113d0 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
113e0 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
113f0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
11400 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
11410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
11420 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
11430 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
11440 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
11450 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
11460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11470 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
11480 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11490 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
114a0 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
114b0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
114c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
114d0 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
114e0 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
114f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11500 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
11510 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
11520 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
11530 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
11540 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
11550 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
11560 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
11570 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
11580 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
11590 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
115a0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
115b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
115c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
115d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
115e0 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
115f0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
11600 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a  ve mode and not.
11610 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ** in the ERROR 
11620 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
11630 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68  , it switches th
11640 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52  e pager to PAGER
11650 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a  _OPEN.** state..
11660 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11670 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
11680 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
11690 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  de, the database
116a0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70   file is.** comp
116b0 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  letely unlocked.
116c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
116d0 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  unlocked and the
116e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65   file-system doe
116f0 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74  s.** not exhibit
11700 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45   the UNDELETABLE
11710 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65  _WHEN_OPEN prope
11720 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rty, the journal
11730 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73   file is.** clos
11740 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65  ed (if it is ope
11750 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n)..**.** If the
11760 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52   pager is in ERR
11770 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
11780 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11790 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63  alled, the .** c
117a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
117b0 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64  ager cache are d
117c0 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20  iscarded before 
117d0 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74  switching back t
117e0 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73  o .** the OPEN s
117f0 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73  tate. Regardless
11800 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
11810 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
11820 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72  usive-mode.** or
11830 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61   not, any journa
11840 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74  l file left in t
11850 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77  he file-system w
11860 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a  ill be treated.*
11870 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * as a hot-journ
11880 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
11890 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ck the next time
118a0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
118b0 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64  ion.** is opened
118c0 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20   (by this or by 
118d0 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  any other connec
118e0 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tion)..*/.static
118f0 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
11900 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
11910 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
11920 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
11930 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20  GER_READER .    
11940 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11950 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
11960 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
11970 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11980 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20  R_ERROR .  );.. 
11990 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
119a0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
119b0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
119c0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
119d0 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c  = 0;.  releaseAl
119e0 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
119f0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65  er);..  if( page
11a00 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
11a10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
11a20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
11a30 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  fd) );.    sqlit
11a40 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
11a50 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
11a60 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  pWal);.    pPage
11a70 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
11a80 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  R_OPEN;.  }else 
11a90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
11aa0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
11ab0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65  /* Error code re
11ae0 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55  turned by pagerU
11af0 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20  nlockDb() */.   
11b00 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65   int iDc = isOpe
11b10 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71  n(pPager->fd)?sq
11b20 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
11b30 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
11b40 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20  ger->fd):0;..   
11b50 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61   /* If the opera
11b60 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
11b70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  ort deletion of 
11b80 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e  open files, then
11b90 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68  .    ** close th
11ba0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
11bb0 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
11bc0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20   database lock. 
11bd0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
11be0 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  * another connec
11bf0 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
11c00 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
11c10 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66  ght delete the f
11c20 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66  ile.    ** out f
11c30 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
11c40 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
11c50 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c60 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35  ODE_MEMORY   & 5
11c70 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11c80 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11c90 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
11ca0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11cb0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11cc0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
11cd0 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
11ce0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11cf0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
11d00 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ETE   & 5)!=1 );
11d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11d20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11d30 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
11d40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11d50 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11d60 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29  DE_PERSIST  & 5)
11d70 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==1 );.    if( 0
11d80 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ==(iDc & SQLITE_
11d90 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
11da0 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20  E_WHEN_OPEN).   
11db0 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d    || 1!=(pPager-
11dc0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35  >journalMode & 5
11dd0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
11de0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11df0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
11e00 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
11e10 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
11e20 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
11e30 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c   the call to unl
11e40 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
11e50 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69  .    ** file fai
11e60 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72  ls, set the curr
11e70 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e  ent lock to UNKN
11e80 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68  OWN_LOCK. See th
11e90 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a  e comment.    **
11ea0 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
11eb0 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c  ne for UNKNOWN_L
11ec0 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
11ed0 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68  nation of why th
11ee0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63  is.    ** is nec
11ef0 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
11f00 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c     rc = pagerUnl
11f10 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f  ockDb(pPager, NO
11f20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
11f30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
11f40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11f50 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a  =PAGER_ERROR ){.
11f60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
11f70 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ock = UNKNOWN_LO
11f80 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
11f90 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74  * The pager stat
11fa0 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64  e may be changed
11fb0 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f   from PAGER_ERRO
11fc0 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  R to PAGER_OPEN 
11fd0 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68  here.    ** with
11fe0 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65  out clearing the
11ff0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69   error code. Thi
12000 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c  s is intentional
12010 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20   - the error.   
12020 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61   ** code is clea
12030 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  red and the cach
12040 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62  e reset in the b
12050 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20  lock below..    
12060 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
12070 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
12080 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12090 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
120a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
120b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
120c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
120d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
120e0 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  N;.  }..  /* If 
120f0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
12100 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
12110 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
12120 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
12130 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
12140 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  w that there are
12150 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
12160 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
12170 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74  e pager,.  ** it
12180 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65   can safely move
12190 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f   back to PAGER_O
121a0 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20  PEN state. This 
121b0 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a  happens in both.
121c0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20    ** normal and 
121d0 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e  exclusive-lockin
121e0 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  g mode..  */.  i
121f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
12200 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 4d  de || pPager->pM
12210 61 70 4f 62 6a 65 63 74 20 29 7b 0a 20 20 20 20  apObject ){.    
12220 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
12230 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
12240 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
12250 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12260 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
12270 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
12280 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12290 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
122a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
122b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
122c0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6d 61 70 28   sqlite3OsUnmap(
122d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
122e0 65 72 2d 3e 70 4d 61 70 4f 62 6a 65 63 74 29 3b  er->pMapObject);
122f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 61  .    pPager->pMa
12300 70 4f 62 6a 65 63 74 20 3d 20 30 3b 0a 20 20 20  pObject = 0;.   
12310 20 70 50 61 67 65 72 2d 3e 61 46 69 6c 65 43 6f   pPager->aFileCo
12320 6e 74 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ntent = 0;.    p
12330 50 61 67 65 72 2d 3e 6e 46 69 6c 65 43 6f 6e 74  Pager->nFileCont
12340 65 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ent = 0;.  }..  
12350 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12360 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
12370 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
12380 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
12390 61 73 74 65 72 20 3d 20 30 3b 0a 0a 7d 0a 0a 2f  aster = 0;..}../
123a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
123b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
123c0 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f  never an IOERR o
123d0 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61  r FULL error tha
123e0 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68  t requires.** th
123f0 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73  e pager to trans
12400 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45  ition into the E
12410 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61  RROR state may a
12420 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  hve occurred..**
12430 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
12440 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
12450 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
12460 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
12470 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ond .** the erro
12480 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
12490 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
124a0 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
124b0 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c  ion. The .** val
124c0 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
124d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
124e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
124f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
12500 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
12510 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
12520 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
12530 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65  ITE_IOERR or one
12540 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52   of the.** IOERR
12550 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20   sub-codes, the 
12560 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
12570 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
12580 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
12590 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
125a0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57  Pager.errCode. W
125b0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72  hile the pager r
125c0 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52  emains in the ER
125d0 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c  ROR state,.** al
125e0 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c  l major API call
125f0 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77  s on the Pager w
12600 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
12610 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72  return Pager.err
12620 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Code..**.** The 
12630 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69  ERROR state indi
12640 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
12650 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12660 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
12670 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
12680 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
12690 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
126a0 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
126b0 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
126c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
126d0 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
126e0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
126f0 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
12700 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
12710 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
12720 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
12730 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
12740 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
12750 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
12760 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
12780 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
12790 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
127a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
127b0 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
127c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
127d0 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
127e0 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
127f0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
12800 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
12810 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
12820 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
12830 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
12840 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
12850 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
12860 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
12870 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
12880 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
12890 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
128a0 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
128b0 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
128c0 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
128d0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
128e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
128f0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
12900 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12910 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
12920 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
12930 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
12940 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
12950 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
12960 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
12970 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
12980 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
12990 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
129a0 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
129b0 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
129c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
129d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
129e0 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
129f0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
12a00 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
12a10 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
12a20 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
12a30 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
12a40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
12a50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12a60 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
12a70 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
12a80 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63  tate. If it is c
12a90 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45  alled.** in PAGE
12aa0 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f  R_NONE or PAGER_
12ab0 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64  SHARED state and
12ac0 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69   the lock held i
12ad0 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73  s less.** exclus
12ae0 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52  ive than a RESER
12af0 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  VED lock, it is 
12b00 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f  a no-op..**.** O
12b10 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
12b20 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
12b30 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
12b40 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
12b50 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
12b60 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
12b70 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
12b80 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
12b90 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
12ba0 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
12bb0 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
12bc0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
12bd0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
12be0 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
12bf0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
12c00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
12c10 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
12c20 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
12c30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
12c40 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
12c50 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
12c60 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
12c70 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
12c80 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
12c90 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12ca0 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
12cb0 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
12cc0 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
12cd0 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
12ce0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12cf0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
12d00 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
12d10 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
12d20 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
12d30 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
12d40 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
12d50 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
12d60 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
12d70 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
12d80 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
12d90 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
12da0 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
12db0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
12dc0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
12dd0 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
12de0 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
12df0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12e00 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
12e10 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
12e20 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
12e30 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
12e40 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
12e50 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
12e60 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
12e70 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
12e80 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
12e90 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
12ea0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
12eb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
12ec0 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
12ed0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
12ee0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
12ef0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
12f00 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
12f10 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
12f20 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
12f30 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
12f40 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
12f50 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
12f60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12f70 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
12f80 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
12f90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
12fa0 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
12fb0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12fc0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
12fd0 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
12fe0 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
12ff0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13000 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
13010 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
13020 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
13030 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74   is finalized, t
13040 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
13050 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
13060 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e  tate..** If runn
13070 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
13080 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  sive rollback mo
13090 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  de, the lock on 
130a0 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20  the file is .** 
130b0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
130c0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
130d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
130e0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
130f0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
13100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13110 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66  during.** any of
13120 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f   the IO operatio
13130 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ns to finalize t
13140 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13150 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a  or unlock the.**
13160 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74   database then t
13170 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
13180 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
13190 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65  the user. If the
131a0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74   .** operation t
131b0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
131c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
131d0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65  s, then the code
131e0 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20   still.** tries 
131f0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
13200 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e  tabase file if n
13210 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
13220 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  mode. If the.** 
13230 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13240 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20   fails as well, 
13250 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65  then the first e
13260 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65  rror code relate
13270 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
13280 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
13290 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c  red (the journal
132a0 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e   finalization on
132b0 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  e) is.** returne
132c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
132d0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
132e0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
132f0 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
13300 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
13310 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13320 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
13330 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  rom journal fina
13340 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  lization operati
13350 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20  on */.  int rc2 
13360 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13370 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
13380 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f  rom db file unlo
13390 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ck operation */.
133a0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
133b0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f   if the pager do
133c0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f  es not have an o
133d0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
133e0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74  ction.  ** or at
133f0 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
13400 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e  D lock. This fun
13410 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
13420 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20  led when there. 
13430 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d   ** is no write-
13440 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
13450 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45  ve but a RESERVE
13460 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
13470 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75  k is.  ** held u
13480 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73  nder two circums
13490 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  tances:.  **.  *
134a0 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73  *   1. After a s
134b0 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f  uccessful hot-jo
134c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
134d0 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  it is called wit
134e0 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61  h.  **      eSta
134f0 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61  te==PAGER_NONE a
13500 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13510 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20  IVE_LOCK..  **. 
13520 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f   **   2. If a co
13530 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f  nnection with lo
13540 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
13550 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  sive holding an 
13560 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20  EXCLUSIVE .  ** 
13570 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68       lock switch
13580 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69  es back to locki
13590 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61  ng_mode=normal a
135a0 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73  nd then executes
135b0 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61   a.  **      rea
135c0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  d-transaction, t
135d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
135e0 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61  called with eSta
135f0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
13600 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20   .  **      and 
13610 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
13620 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72  _LOCK when the r
13630 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
13640 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a  is closed..  */.
13650 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
13660 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
13670 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
13680 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
13690 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
136a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
136b0 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
136c0 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61  ER_LOCKED && pPa
136d0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52  ger->eLock<RESER
136e0 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
136f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13700 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  ;.  }..  release
13710 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
13720 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
13730 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13740 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
13750 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
13760 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
13770 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13780 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
13790 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
137a0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
137b0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
137c0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
137d0 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
137e0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  nal(pPager->jfd)
137f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13800 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13810 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13820 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
13830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13840 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13850 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
13860 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13870 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13880 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13890 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
138a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
138b0 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
138c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
138d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
138e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
138f0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
13900 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
13920 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13930 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
13940 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13950 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13960 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
13970 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
13980 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
13990 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
139a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
139b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
139c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
139d0 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
139e0 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
139f0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ter);.      pPag
13a00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13a10 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
13a20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
13a30 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
13a40 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
13a50 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13a60 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
13a70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
13a80 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
13a90 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
13aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
13ab0 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
13ac0 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
13ad0 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
13ae0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
13af0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
13b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
13b10 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
13b20 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
13b30 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  y journal. .    
13b40 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
13b50 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13b60 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13b70 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
13b80 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13b90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ba0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13bb0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
13bc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13bd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13be0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13bf0 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
13c00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13c10 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13c20 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
13c30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13c40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13c50 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
13c60 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
13c70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
13c80 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13c90 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
13ca0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
13cb0 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  S.  sqlite3Pcach
13cc0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
13cd0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
13ce0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
13cf0 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
13d00 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73  ->dbSize==0 && s
13d10 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
13d20 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
13d30 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50  ache)>0 ){.    P
13d40 67 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f  gHdr *p = pager_
13d50 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  lookup(pPager, 1
13d60 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
13d70 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
13d80 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
13d90 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
13da0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
13db0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
13dc0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
13dd0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
13de0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
13df0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
13e00 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
13e10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
13e20 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
13e30 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74  PCache);.  sqlit
13e40 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
13e50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13e60 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
13e70 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
13e80 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
13e90 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
13ea0 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
13eb0 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
13ec0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
13ed0 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
13ee0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
13ef0 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
13f00 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
13f10 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
13f20 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
13f30 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
13f40 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
13f50 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
13f60 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
13f70 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
13f80 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
13f90 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
13fa0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  K );.  }.  if( !
13fb0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13fc0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70  eMode .   && (!p
13fd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13fe0 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c  r) || sqlite3Wal
13ff0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
14000 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a  ager->pWal, 0)).
14010 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70    ){.    rc2 = p
14020 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
14030 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
14040 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
14050 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
14060 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
14070 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
14080 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65  _READER;.  pPage
14090 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
140a0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
140b0 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
140c0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  c);.}../*.** Exe
140d0 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
140e0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
140f0 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
14100 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
14110 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
14120 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
14130 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
14140 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
14150 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
14160 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
14170 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
14180 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
14190 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
141a0 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
141b0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
141c0 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
141d0 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
141e0 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
141f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14200 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  le and move the 
14210 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50  pager back to OP
14220 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  EN state. If thi
14230 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  s .** means that
14240 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
14250 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
14260 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
14270 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f   the next .** co
14280 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  nnection to obta
14290 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
142a0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
142b0 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
142c0 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72   one) .** will r
142d0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
142e0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
142f0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
14300 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14310 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  R state, but an 
14320 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
14330 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14340 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14350 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
14360 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
14370 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
14380 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  er the ERROR sta
14390 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
143a0 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
143b0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
143c0 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
143d0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
143e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
143f0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
14400 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
14410 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
14420 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
14430 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65  R_ERROR && pPage
14440 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14450 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73  _OPEN ){.    ass
14460 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
14470 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
14480 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
14490 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
144a0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
144b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
144c0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
144d0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
144e0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
144f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
14500 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
14510 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
14520 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
14530 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
14540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14550 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
14560 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
14570 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
14580 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14590 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
145a0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
145b0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
145c0 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
145d0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
145e0 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
145f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
14600 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
14610 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
14620 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
14630 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
14640 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
14650 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
14660 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
14670 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
14680 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
14690 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
146a0 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
146b0 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
146c0 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
146d0 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
146e0 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
146f0 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
14700 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
14710 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
14720 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
14730 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
14740 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
14750 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
14760 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
14770 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
14780 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
14790 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
147a0 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
147b0 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
147c0 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
147d0 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
147e0 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
147f0 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
14800 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
14810 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
14820 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
14830 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
14840 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
14850 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
14860 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
14870 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
14880 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
14890 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
148a0 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
148b0 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
148c0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
148d0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
148e0 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
148f0 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
14900 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
14910 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
14920 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
14930 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
14940 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
14950 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
14960 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
14970 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
14980 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
14990 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
149a0 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
149b0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
149c0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
149d0 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
149e0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
149f0 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
14a00 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
14a10 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
14a20 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
14a30 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
14a40 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
14a50 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
14a60 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
14a70 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
14a80 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
14a90 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
14aa0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
14ab0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
14ac0 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
14ad0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
14ae0 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
14af0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
14b00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14b10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
14b20 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
14b30 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
14b40 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
14b50 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
14b60 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
14b90 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
14ba0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
14bb0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
14bc0 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
14bd0 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
14be0 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
14bf0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
14c00 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
14c10 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
14c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14c30 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
14c40 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
14c50 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
14c60 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
14c70 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
14c80 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
14c90 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
14ca0 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
14cb0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
14cc0 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
14cd0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
14ce0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
14cf0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
14d00 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
14d10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
14d20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
14d30 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
14d40 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
14d50 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
14d60 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
14d70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
14d80 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
14d90 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
14da0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14db0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
14dc0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
14dd0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
14de0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
14df0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
14e00 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
14e10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
14e20 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
14e30 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
14e40 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
14e50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
14e60 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
14e70 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
14e80 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
14e90 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
14ea0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
14eb0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
14ec0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
14ed0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
14ee0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
14ef0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
14f00 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
14f10 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
14f20 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
14f30 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
14f40 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
14f50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
14f60 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
14f70 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
14f80 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
14f90 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
14fa0 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
14fb0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
14fc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
14fd0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
14fe0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
14ff0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
15000 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
15020 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
15030 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15040 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
15050 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
15060 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
15070 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
15080 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15090 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
150a0 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
150b0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
150c0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
150d0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
150e0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
150f0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
15100 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
15110 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
15120 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
15130 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
15140 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
15150 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
15160 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15170 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
15180 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
15190 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
151a0 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
151b0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
151c0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
151d0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
151e0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
151f0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
15200 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
15210 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
15220 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
15240 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
15250 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
15260 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
15270 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
15280 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
15290 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
152a0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
152b0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
152c0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
152d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
152e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
152f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
15300 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
15310 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
15320 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
15330 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
15340 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
15350 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
15360 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
15370 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
15380 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
15390 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
153a0 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
153b0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
153c0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
153d0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
153e0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
153f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
15400 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
15410 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
15420 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
15430 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
15440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15450 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
15460 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
15470 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
15480 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
154a0 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
154b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
154c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
154f0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
15500 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
15510 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
15520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
15530 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
15540 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
15550 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
15560 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
15570 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
15580 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
15590 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
155a0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
155b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
155c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
155d0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
155e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
155f0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
15600 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15610 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
15620 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
15630 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
15640 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
15650 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
15660 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
15670 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
15680 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
15690 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
156a0 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
156b0 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
156c0 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
156d0 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
156e0 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
156f0 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
15700 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
15710 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
15720 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
15730 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
15740 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
15750 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
15760 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
15770 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
15780 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
15790 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
157a0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
157b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
157c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
157d0 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
157e0 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
157f0 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  t) );..  /* Eith
15800 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20  er the state is 
15810 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47  greater than PAG
15820 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
15830 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f  OD (a transactio
15840 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  n .  ** or savep
15850 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f  oint rollback do
15860 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73  ne at the reques
15870 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29  t of the caller)
15880 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   or this is.  **
15890 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
158a0 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69  ollback. If it i
158b0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
158c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61  rollback, the pa
158d0 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73  ger.  ** is in s
158e0 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f  tate OPEN and ho
158f0 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  lds an EXCLUSIVE
15900 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e   lock. Hot-journ
15910 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  al rollback.  **
15920 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d   only reads from
15930 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15940 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a  l, not the sub-j
15950 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
15960 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
15970 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
15980 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
15990 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
159a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
159b0 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  EN && pPager->eL
159c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
159d0 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65  OCK).  );.  asse
159e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
159f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
15a00 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d  _CACHEMOD || isM
15a10 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a  ainJrnl );..  /*
15a20 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
15a30 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
15a40 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
15a50 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
15a60 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
15a70 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
15a80 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
15a90 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
15aa0 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
15ab0 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
15ac0 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
15ad0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
15ae0 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
15af0 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
15b00 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
15b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
15b20 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
15b30 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
15b40 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
15b50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
15b60 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
15b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15b80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15b90 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
15ba0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15bb0 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
15bc0 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
15bd0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
15be0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
15bf0 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
15c00 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
15c10 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
15c20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
15c30 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
15c40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
15c50 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
15c60 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
15c70 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
15c80 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
15c90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
15ca0 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
15cb0 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
15cc0 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
15cd0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
15ce0 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
15cf0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
15d00 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
15d10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
15d20 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
15d30 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
15d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15d50 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
15d60 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
15d70 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
15d80 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
15d90 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
15da0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15db0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
15dc0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
15dd0 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
15de0 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
15df0 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
15e00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
15e10 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
15e20 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
15e30 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
15e40 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
15e50 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
15e60 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
15e70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15e80 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73  If this page has
15e90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
15ea0 61 79 65 64 20 62 79 20 62 65 66 6f 72 65 20 64  ayed by before d
15eb0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
15ec0 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c  t.  ** rollback,
15ed0 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68   then don't both
15ee0 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  er to play it ba
15ef0 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  ck again..  */. 
15f00 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72   if( pDone && (r
15f10 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
15f20 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  cSet(pDone, pgno
15f30 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
15f40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15f50 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70    }..  /* When p
15f60 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65  laying back page
15f70 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20   1, restore the 
15f80 6e 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67  nReserve setting
15f90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
15fa0 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  ==1 && pPager->n
15fb0 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61  Reserve!=((u8*)a
15fc0 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20  Data)[20] ){.   
15fd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
15fe0 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29  e = ((u8*)aData)
15ff0 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52  [20];.    pagerR
16000 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
16010 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
16020 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
16030 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20  CACHEMOD state, 
16040 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
16050 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
16060 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
16070 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16080 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
16090 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
160a0 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
160b0 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
160c0 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
160d0 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
160e0 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
160f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
16100 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
16110 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
16120 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
16130 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
16140 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
16150 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
16160 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
16170 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
16180 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
16190 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
161a0 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
161b0 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
161c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
161d0 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
161e0 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
161f0 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
16200 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
16210 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
16220 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
16230 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
16240 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
16250 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
16260 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
16270 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49  *.  ** If in WRI
16280 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45  TER_DBMOD, WRITE
16290 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50  R_FINISHED or OP
162a0 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  EN state, then w
162b0 65 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a  e update the.  *
162c0 2a 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  * pager cache if
162d0 20 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74   it exists and t
162e0 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
162f0 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
16300 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20  arked .  ** not 
16310 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69  dirty. Since thi
16320 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65  s code is only e
16330 78 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52  xecuted in PAGER
16340 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a  _OPEN state for.
16350 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
16360 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20  al rollback, it 
16370 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
16380 61 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  at the page-cach
16390 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20  e is empty.  ** 
163a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
163b0 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  in OPEN state.. 
163c0 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
163d0 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
163e0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
163f0 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
16400 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
16410 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
16420 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
16430 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
16440 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
16450 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
16460 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
16470 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
16480 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
16490 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
164a0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
164b0 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
164c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
164d0 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
164e0 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
164f0 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
16500 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
16510 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
16520 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
16530 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
16540 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
16550 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
16560 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
16570 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
16580 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
16590 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
165a0 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
165b0 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
165c0 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
165d0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
165e0 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
165f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
16600 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
16610 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
16620 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
16630 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
16640 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
16650 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
16660 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
16670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16680 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
16690 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
166a0 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
166b0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
166c0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
166d0 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
166e0 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
166f0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
16700 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
16710 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
16720 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
16730 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
16740 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
16750 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
16760 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
16770 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
16780 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
16790 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
167a0 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
167b0 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
167c0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
167d0 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
167e0 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
167f0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
16800 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
16810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
16820 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
16830 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ened..  */.  if(
16840 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
16850 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20  ger) ){.    pPg 
16860 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
16870 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
16880 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
16890 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
168a0 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
168b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
168c0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
168d0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
168e0 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
168f0 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
16900 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
16910 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
16920 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
16930 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
16940 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
16950 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
16960 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
16970 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
16980 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
16990 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
169a0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
169b0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
169c0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
169d0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
169e0 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
169f0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
16a00 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
16a10 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
16a20 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
16a30 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
16a40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
16a50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
16a60 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
16a70 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
16a80 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
16a90 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
16aa0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
16ab0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
16ac0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
16ad0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
16ae0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
16af0 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
16b00 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
16b10 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
16b20 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
16b30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
16b40 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
16b50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
16b60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
16b70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
16b80 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
16b90 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
16ba0 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ;.    if( pgno>p
16bb0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
16bc0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
16bd0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
16be0 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
16bf0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
16c00 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  kup ){.      COD
16c10 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
16c20 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
16c30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
16c40 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
16c50 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
16c60 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
16c70 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
16c80 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
16c90 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c   aData, pgno, 7,
16ca0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
16cb0 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  , aData);.    }.
16cc0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
16cd0 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
16ce0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
16cf0 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
16d00 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
16d10 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
16d20 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
16d30 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
16d40 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
16d50 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
16d60 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
16d70 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
16d80 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
16d90 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
16da0 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
16db0 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
16dc0 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
16dd0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
16de0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
16df0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
16e00 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
16e10 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16e20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
16e30 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
16e40 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
16e50 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
16e60 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
16e70 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
16e80 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
16e90 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
16ea0 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
16eb0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
16ec0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
16ed0 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
16ee0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
16ef0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
16f00 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
16f10 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
16f20 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
16f30 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
16f40 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
16f50 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
16f60 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
16f70 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
16f80 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
16f90 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
16fa0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
16fb0 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
16fc0 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
16fd0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
16fe0 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
16ff0 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
17000 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17010 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
17020 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
17030 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
17040 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
17050 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
17060 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
17070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
17080 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20  otSpill==0 );.  
17090 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
170a0 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d  pill++;.    rc =
170b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
170c0 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
170d0 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
170e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
170f0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29  >doNotSpill==1 )
17100 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
17110 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20  NotSpill--;.    
17120 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17130 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
17140 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
17150 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
17160 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
17170 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
17180 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
17190 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
171a0 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
171b0 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
171c0 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
171d0 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
171e0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
171f0 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
17200 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
17210 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
17220 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
17230 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
17240 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
17250 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
17260 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
17270 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
17280 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
17290 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
172a0 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
172b0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
172c0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
172d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
172e0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
172f0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
17300 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
17310 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
17320 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17330 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
17340 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
17350 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17360 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
17370 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
17380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
17390 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
173a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
173b0 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
173c0 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
173d0 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
173e0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
173f0 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
17400 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
17410 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
17420 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
17430 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
17440 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
17450 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
17460 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
17470 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
17480 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
17490 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
174a0 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
174b0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
174c0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
174d0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
174e0 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
174f0 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
17500 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
17510 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
17520 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
17530 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
17540 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
17550 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
17560 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
17570 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
17580 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
17590 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
175a0 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
175b0 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
175c0 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
175d0 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
175e0 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
175f0 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
17600 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
17610 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17620 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
17630 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
17640 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
17650 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
17660 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
17670 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
17680 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
17690 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
176a0 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
176b0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
176c0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
176d0 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
176e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
176f0 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
17700 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
17710 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17720 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
17730 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
17740 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
17750 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
17760 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
17770 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17780 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
17790 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
177a0 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
177b0 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
177c0 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
177d0 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
177e0 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
177f0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17800 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
17810 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
17820 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
17830 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
17840 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17850 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
17860 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
17870 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
17880 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
17890 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
178a0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
178b0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
178c0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
178d0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
178e0 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
178f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
17900 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
17910 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
17920 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
17930 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
17940 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
17950 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
17960 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
17970 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
17980 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
17990 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
179a0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
179b0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
179c0 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
179d0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
179e0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
179f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
17a00 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
17a10 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17a20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
17a30 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
17a40 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
17a50 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
17a60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
17a70 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
17a80 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
17a90 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
17aa0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
17ab0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
17ac0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
17ad0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
17ae0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
17af0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
17b00 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
17b10 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
17b20 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
17b30 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
17b40 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
17b50 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
17b60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
17b70 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
17b80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17b90 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
17ba0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
17bb0 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
17bc0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
17bd0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
17be0 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
17bf0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
17c00 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
17c10 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
17c20 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
17c30 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
17c40 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
17c50 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
17c60 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
17c70 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
17c80 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
17c90 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
17ca0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
17cb0 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
17cc0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
17cd0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
17ce0 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
17cf0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
17d00 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
17d10 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
17d20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17d30 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
17d40 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
17d50 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
17d60 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
17d70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
17d80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17d90 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
17da0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
17db0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
17dc0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
17dd0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
17de0 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
17df0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
17e00 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
17e10 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
17e20 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
17e30 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
17e40 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
17e50 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
17e60 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
17e70 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
17e80 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
17e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17ea0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
17eb0 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
17ec0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
17ed0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
17ee0 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
17ef0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
17f00 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
17f10 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
17f20 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
17f30 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
17f40 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
17f50 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
17f60 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
17f70 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
17f80 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
17f90 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
17fa0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
17fb0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
17fc0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
17fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
17fe0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
17ff0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
18000 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
18010 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
18020 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
18030 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
18040 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
18050 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
18060 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18070 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
18080 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
18090 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
180a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
180b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
180c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
180d0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
180e0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
180f0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
18100 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
18110 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
18120 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
18130 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
18140 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
18150 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
18160 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
18170 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
18180 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
18190 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
181a0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
181b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
181c0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
181d0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
181e0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
181f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18200 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18210 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
18220 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
18230 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
18240 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
18250 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18260 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
18270 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
18280 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
18290 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
182a0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
182b0 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
182c0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
182d0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
182e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
182f0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
18300 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
18310 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
18320 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
18330 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
18340 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
18350 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
18360 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
18370 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
18380 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18390 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
183a0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
183b0 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
183c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
183d0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
183e0 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
183f0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
18400 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
18410 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
18420 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
18430 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
18440 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
18450 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
18460 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
18470 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
18480 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
18490 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
184a0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
184b0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
184c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
184d0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
184e0 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
184f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
18500 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
18510 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
18520 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
18530 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18540 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
18550 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
18560 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
18570 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
18580 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
18590 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
185a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
185b0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
185c0 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
185d0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
185e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
185f0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18600 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
18610 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
18620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
18630 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
18640 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
18650 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
18660 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
18670 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
18680 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
18690 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
186a0 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
186b0 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
186c0 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
186d0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
186e0 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
186f0 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
18700 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
18710 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18720 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
18730 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
18740 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
18750 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18760 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18770 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
18780 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
18790 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
187a0 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
187b0 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  oc((int)nMasterJ
187c0 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
187d0 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
187e0 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
187f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18800 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
18810 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18820 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
18830 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
18840 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
18850 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
18860 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
18870 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
18880 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
18890 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
188a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
188b0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
188c0 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
188d0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
188e0 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
188f0 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
18900 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
18910 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
18920 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
18930 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
18940 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
18950 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18960 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
18970 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
18980 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
18990 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
189a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
189b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
189c0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
189d0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
189e0 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
189f0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
18a00 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
18a10 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18a20 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
18a30 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
18a40 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
18a50 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
18a60 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
18a70 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
18a80 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
18a90 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
18aa0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
18ab0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
18ac0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
18ad0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
18ae0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
18af0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
18b00 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
18b10 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
18b20 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
18b30 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
18b40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18b60 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
18b70 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
18b80 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
18b90 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
18ba0 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
18bb0 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
18bc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18bd0 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
18be0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18c00 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
18c10 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
18c20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
18c30 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
18c40 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
18c50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
18c60 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
18c70 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
18c80 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
18c90 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
18ca0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18cb0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
18cc0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18ce0 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
18cf0 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
18d00 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
18d10 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
18d20 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
18d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18d40 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
18d50 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
18d60 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
18d70 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
18d80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
18d90 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
18da0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
18db0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
18dc0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
18dd0 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
18de0 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
18df0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
18e00 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
18e10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18e20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
18e30 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
18e40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
18e50 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
18e60 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
18e70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
18e80 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
18e90 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
18ea0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
18eb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
18ec0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
18ed0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
18ee0 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
18ef0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
18f00 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
18f10 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20  n, or the pager 
18f20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72  is not in either
18f30 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45  .** DBMOD or OPE
18f40 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  N state, this fu
18f50 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
18f60 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
18f70 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68  e size .** of th
18f80 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65  e file is change
18f90 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
18fa0 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
18fb0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
18fc0 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65   .** If the file
18fd0 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
18fe0 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
18ff0 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
19000 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
19010 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
19020 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
19030 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
19040 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62  it might might b
19050 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
19060 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
19070 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
19080 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
19090 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
190a0 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
190b0 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
190c0 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
190d0 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
190e0 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
190f0 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
19100 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
19110 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
19120 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
19130 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
19140 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
19150 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
19160 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
19170 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
19180 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
19190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
191a0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
191b0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
191c0 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
191d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
191e0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
191f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
19200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19210 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
19220 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19230 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
19240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19250 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19260 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
19270 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
19280 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19290 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te!=PAGER_READER
192a0 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f   );.  .  if( isO
192b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
192c0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
192d0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
192e0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
192f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
19300 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a  GER_OPEN) .  ){.
19310 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
19320 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
19330 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70    int szPage = p
19340 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19360 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
19370 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
19380 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
19390 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
193a0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
193b0 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
193c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
193d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
193e0 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
193f0 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67   newSize = szPag
19400 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
19410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19420 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
19430 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
19440 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
19450 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
19460 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19470 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
19480 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
19490 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
194a0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
194b0 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
194c0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
194d0 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
194e0 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
194f0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
19500 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3c 20  wSize-szPage) < 
19510 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
19520 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19530 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
19540 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a  e) == currentSiz
19550 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e );.        tes
19560 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
19570 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65  szPage) >  curre
19580 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
19590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
195a0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
195b0 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20  , pTmp, szPage, 
195c0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b  newSize-szPage);
195d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
195e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
195f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
19600 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
19610 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
19620 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19630 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19640 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19650 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19660 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19670 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19680 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19690 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
196a0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
196b0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
196c0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
196d0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
196e0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
196f0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19700 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19710 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19720 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19730 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19740 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19750 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
19760 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
19770 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
19780 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
19790 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
197a0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
197b0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
197c0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
197d0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
197e0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
197f0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19800 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
19810 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19820 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
19830 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
19840 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
19850 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
19860 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
19870 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
19880 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
19890 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
198a0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
198b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
198c0 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
198d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
198e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
198f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
19900 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
19910 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
19920 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
19930 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
19940 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
19950 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19960 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
19970 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
19980 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
19990 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
199a0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
199b0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
199c0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
199d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
199e0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
199f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
19a00 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
19a10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
19a20 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
19a30 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  32 ){.    pPager
19a40 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
19a50 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  12;.  }.  if( pP
19a60 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
19a70 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19a80 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19a90 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19aa0 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67  =512 );.    pPag
19ab0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
19ac0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19ad0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
19ae0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
19af0 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
19b00 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
19b10 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
19b20 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
19b30 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
19b40 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
19b50 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
19b60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
19b70 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
19b80 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
19b90 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
19ba0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
19bb0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
19bc0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
19bd0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
19be0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
19bf0 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
19c00 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
19c10 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
19c20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
19c30 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
19c40 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
19c50 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
19c60 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
19c70 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
19c80 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
19c90 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
19ca0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
19cb0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
19cc0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
19cd0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
19ce0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
19cf0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
19d00 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
19d10 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
19d20 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
19d30 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
19d40 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
19d50 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
19d60 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19d70 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19d80 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
19d90 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
19da0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
19db0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
19dc0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
19dd0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19de0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19df0 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
19e00 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
19e10 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
19e20 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
19e30 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
19e40 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
19e50 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
19e60 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
19e70 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
19e80 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
19e90 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
19ea0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
19eb0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
19ec0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
19ed0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
19ee0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
19ef0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
19f00 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
19f10 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
19f20 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
19f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
19f40 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
19f50 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
19f60 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
19f70 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
19f80 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
19f90 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
19fa0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
19fb0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
19fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
19fd0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
19fe0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
19ff0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1a000 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1a010 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a020 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1a030 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1a040 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1a050 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1a060 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1a070 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1a080 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1a090 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1a0a0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1a0b0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1a0c0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1a0d0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1a0e0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1a0f0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1a100 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1a110 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1a120 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1a130 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a140 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1a150 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1a160 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1a170 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1a180 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1a190 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1a1a0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1a1b0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1a1c0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1a1d0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1a1e0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1a1f0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1a200 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1a210 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1a220 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1a230 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1a240 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1a250 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1a260 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1a270 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1a280 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1a290 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1a2a0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1a2b0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1a2c0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1a2d0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1a2e0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1a2f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1a300 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1a310 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1a320 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1a330 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1a340 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1a350 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1a360 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1a370 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1a380 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1a390 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1a3a0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1a3b0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1a3c0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1a3d0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1a3e0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1a3f0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1a400 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1a410 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1a420 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1a430 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1a440 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1a450 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1a460 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1a470 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1a480 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1a490 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1a4a0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1a4b0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1a4c0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1a4d0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1a4e0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1a4f0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1a500 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1a510 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1a520 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1a530 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1a540 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1a550 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1a560 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1a570 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1a580 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1a590 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1a5a0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1a5b0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1a5c0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1a5d0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1a5e0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1a5f0 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1a600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1a610 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1a620 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1a630 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1a640 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1a650 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1a660 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1a670 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a680 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a690 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1a6a0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a6c0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1a6d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1a6e0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1a700 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1a710 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1a720 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1a730 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1a740 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1a750 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1a760 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a770 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1a780 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1a790 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1a7a0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1a7b0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1a7c0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1a7d0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1a7e0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1a7f0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1a800 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1a810 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1a820 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1a830 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1a840 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1a850 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1a860 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1a870 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
1a880 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
1a890 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
1a8a0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
1a8b0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
1a8c0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
1a8d0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
1a8e0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1a8f0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
1a900 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1a910 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1a920 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
1a930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a940 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1a950 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
1a960 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
1a970 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
1a980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
1a990 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
1a9a0 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
1a9b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1a9c0 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
1a9d0 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
1a9e0 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
1a9f0 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
1aa00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
1aa10 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
1aa20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
1aa30 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
1aa40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
1aa50 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
1aa60 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
1aa70 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
1aa80 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
1aa90 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
1aaa0 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
1aab0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
1aac0 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
1aad0 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
1aae0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
1aaf0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
1ab00 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
1ab10 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
1ab20 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
1ab30 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
1ab40 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
1ab50 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
1ab60 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
1ab70 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
1ab80 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
1ab90 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1aba0 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
1abb0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1abc0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1abd0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1abe0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
1abf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ac00 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
1ac10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1ac20 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
1ac30 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
1ac40 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1ac50 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
1ac60 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
1ac70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1ac80 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
1ac90 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1aca0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
1acb0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1acc0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
1acd0 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
1ace0 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
1acf0 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
1ad00 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
1ad10 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
1ad20 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1ad30 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
1ad40 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
1ad50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
1ad60 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
1ad70 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
1ad80 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
1ad90 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
1ada0 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
1adb0 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
1adc0 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
1add0 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
1ade0 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
1adf0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
1ae00 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
1ae10 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
1ae20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
1ae30 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68  a process must h
1ae40 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65  ave failed while
1ae50 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
1ae60 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
1ae70 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
1ae80 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
1ae90 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
1aea0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
1aeb0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
1aec0 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65  isHot, szJ, &nRe
1aed0 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
1aee0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aef0 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
1af00 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1af10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1af20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1af30 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
1af40 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
1af50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1af60 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1af70 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
1af80 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
1af90 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
1afa0 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
1afb0 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
1afc0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
1afd0 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
1afe0 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
1aff0 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
1b000 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
1b010 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
1b020 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
1b030 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
1b040 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
1b050 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
1b060 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1b070 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
1b080 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b090 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b0a0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1b0b0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
1b0c0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1b0d0 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  )((szJ - JOURNAL
1b0e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
1b0f0 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
1b100 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1b110 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1b120 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
1b130 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
1b140 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
1b150 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
1b160 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
1b170 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
1b180 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
1b190 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
1b1a0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
1b1b0 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
1b1c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1b1d0 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
1b1e0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1b1f0 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
1b200 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
1b210 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1b220 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
1b230 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
1b240 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
1b250 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
1b260 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
1b270 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
1b280 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
1b290 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
1b2a0 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e    ** When rollin
1b2b0 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75  g back a hot jou
1b2c0 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c  rnal, nRec==0 al
1b2d0 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20  ways means that 
1b2e0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  the next.    ** 
1b2f0 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75  chunk of the jou
1b300 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65  rnal contains ze
1b310 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72  ro pages to be r
1b320 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74  olled back.  But
1b330 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69  .    ** when doi
1b340 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e  ng a ROLLBACK an
1b350 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68  d the nRec==0 ch
1b360 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20  unk is the last 
1b370 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20  chunk in.    ** 
1b380 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  the journal, it 
1b390 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a  means that the j
1b3a0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
1b3b0 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a  tain additional.
1b3c0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61      ** pages tha
1b3d0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c  t need to be rol
1b3e0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61  led back and tha
1b3f0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1b400 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68  pages .    ** sh
1b410 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1b420 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f   based on the jo
1b430 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e  urnal file size.
1b440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b450 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
1b460 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
1b470 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
1b480 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b490 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
1b4a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
1b4b0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1b4c0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
1b4d0 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
1b4e0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
1b4f0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
1b500 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1b510 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
1b520 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
1b530 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
1b540 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
1b550 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
1b560 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
1b570 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1b580 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1b590 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1b5a0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
1b5b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1b5c0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
1b5d0 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
1b5e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b5f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1b600 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1b620 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
1b630 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xPg;.    }..    
1b640 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
1b650 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
1b660 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
1b670 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  ck into the .   
1b680 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b690 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61  e and/or page ca
1b6a0 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  che..    */.    
1b6b0 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b  for(u=0; u<nRec;
1b6c0 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   u++){.      if(
1b6d0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b6e0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
1b6f0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1b700 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65          needPage
1b710 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rReset = 0;.    
1b720 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
1b730 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1b740 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70  e_page(pPager,&p
1b750 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b760 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20  f,0,1,0);.      
1b770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
1b790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1b7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1b7b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b7c0 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1b7d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b7e0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1b7f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1b800 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1b810 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1b820 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1b830 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1b840 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1b850 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1b860 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1b870 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1b880 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1b890 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1b8a0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1b8b0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1b8c0 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1b8d0 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1b8e0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1b8f0 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1b900 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1b910 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1b920 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1b930 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1b940 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1b950 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1b960 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1b970 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1b980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b990 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1b9a0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1b9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b9c0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1b9d0 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1b9e0 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1b9f0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1ba00 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1ba10 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1ba20 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1ba30 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1ba40 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1ba50 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1ba60 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1ba70 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1ba80 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1ba90 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1baa0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1bab0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1bac0 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1bad0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1bae0 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1baf0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1bb00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bb10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1bb20 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1bb30 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1bb40 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1bb50 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1bb60 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1bb70 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1bb80 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1bb90 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1bba0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1bbb0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1bbc0 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1bbd0 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1bbe0 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1bbf0 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1bc00 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1bc10 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1bc20 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1bc30 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1bc40 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1bc50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1bc60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d  .    pPager->fd-
1bc70 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a  >pMethods==0 ||.
1bc80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
1bc90 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
1bca0 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1bcb0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1bcc0 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b  >=SQLITE_OK.  );
1bcd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1bce0 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
1bcf0 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
1bd00 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
1bd10 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
1bd20 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
1bd30 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
1bd40 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
1bd50 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1bd60 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
1bd70 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1bd80 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
1bd90 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
1bda0 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
1bdb0 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
1bdc0 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
1bdd0 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
1bde0 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
1bdf0 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
1be00 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
1be10 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
1be20 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
1be30 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
1be40 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
1be50 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1be60 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
1be70 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
1be80 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
1be90 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
1bea0 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
1beb0 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
1bec0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
1bed0 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
1bee0 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
1bef0 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
1bf00 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
1bf10 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
1bf20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1bf30 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1bf40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1bf50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf60 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
1bf70 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1bf80 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
1bf90 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1bfa0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1bfb0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1bfc0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bfd0 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
1bfe0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1bff0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1c000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1c010 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1c020 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1c030 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1c040 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1c050 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1c060 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c070 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a 20 20  Sync(pPager);.  
1c080 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c0a0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1c0b0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1c0c0 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1c0d0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c0e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c0f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1c100 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1c110 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
1c120 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1c130 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
1c140 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
1c150 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1c160 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
1c170 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1c180 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
1c190 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
1c1a0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
1c1b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
1c1c0 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
1c1d0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
1c1e0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c1f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
1c200 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
1c210 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1c220 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
1c230 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
1c240 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
1c250 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
1c260 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
1c270 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
1c280 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
1c290 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
1c2a0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
1c2b0 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
1c2c0 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
1c2d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1c2e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1c2f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
1c300 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
1c310 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
1c320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c330 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
1c340 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
1c350 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
1c360 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
1c370 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1c380 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
1c390 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1c3a0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
1c3b0 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
1c3c0 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
1c3d0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
1c3e0 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
1c3f0 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
1c400 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
1c410 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1c420 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
1c430 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1c440 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
1c450 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1c460 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
1c470 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
1c480 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1c490 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
1c4a0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
1c4b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1c4c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
1c4d0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1c4e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1c4f0 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67  page pPg */.  Pg
1c500 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
1c510 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  gno;       /* Pa
1c520 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61  ge number to rea
1c530 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
1c540 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1c550 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1c560 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  de */.  int isIn
1c570 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Wal = 0;        
1c580 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c590 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66  page is in log f
1c5a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ile */.  int pgs
1c5b0 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  z = pPager->page
1c5c0 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20  Size; /* Number 
1c5d0 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
1c5e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1c5f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1c600 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21  AGER_READER && !
1c610 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
1c620 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1c630 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
1c640 74 28 20 70 50 67 2d 3e 70 42 75 66 3d 3d 70 50  t( pPg->pBuf==pP
1c650 67 2d 3e 70 44 61 74 61 20 29 3b 0a 0a 20 20 69  g->pData );..  i
1c660 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
1c670 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
1c680 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65   Try to pull the
1c690 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77   page from the w
1c6a0 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20  rite-ahead log. 
1c6b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1c6c0 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65  te3WalRead(pPage
1c6d0 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
1c6e0 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70  isInWal, pgsz, p
1c6f0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a  Pg->pData);.  }.
1c700 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c710 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20  _OK && !isInWal 
1c720 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73  ){.    i64 iOffs
1c730 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1c740 36 34 29 70 67 73 7a 3b 0a 20 20 20 20 69 66 28  64)pgsz;.    if(
1c750 20 69 4f 66 66 73 65 74 2b 70 67 73 7a 20 3c 3d   iOffset+pgsz <=
1c760 20 70 50 61 67 65 72 2d 3e 6e 46 69 6c 65 43 6f   pPager->nFileCo
1c770 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 70  ntent ){.      p
1c780 50 67 2d 3e 70 44 61 74 61 20 3d 20 26 70 50 61  Pg->pData = &pPa
1c790 67 65 72 2d 3e 61 46 69 6c 65 43 6f 6e 74 65 6e  ger->aFileConten
1c7a0 74 5b 69 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  t[iOffset];.    
1c7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c7c0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1c7d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1c7e0 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1c7f0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 69 66  ffset);.      if
1c800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1c810 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1c820 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1c840 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1c850 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1c860 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1c870 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
1c880 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
1c890 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
1c8a0 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
1c8b0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
1c8c0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
1c8d0 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
1c8e0 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
1c8f0 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
1c900 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
1c910 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1c920 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
1c930 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
1c940 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
1c950 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ero or the size 
1c960 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c970 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33  in page. Bytes 3
1c980 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39  2..35 and 35..39
1c990 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  .      ** should
1c9a0 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73   be page numbers
1c9b0 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72   which are never
1c9c0 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f   0xffffffff.  So
1c9d0 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a   filling.      *
1c9e0 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  * pPager->dbFile
1c9f0 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20  Vers[] with all 
1ca00 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c  0xff bytes shoul
1ca10 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20  d suffice..     
1ca20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
1ca30 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
1ca40 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75  tabase, the situ
1ca50 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f  ation is more co
1ca60 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20  mplex:  bytes.  
1ca70 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66      ** 24..39 of
1ca80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72   the database ar
1ca90 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20  e white noise.  
1caa0 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c  But the probabil
1cab0 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ity of.      ** 
1cac0 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71  white noising eq
1cad0 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1cae0 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1caf0 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1cb00 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1cb10 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1cb20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1cb30 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1cb40 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1cb50 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1cb60 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1cb70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1cb80 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1cb90 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1cba0 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1cbb0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1cbc0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1cbd0 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1cbe0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1cbf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1cc00 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1cc10 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
1cc20 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
1cc30 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  MEM);..  PAGER_I
1cc40 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1cc50 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1cc60 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1cc70 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1cc80 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1cc90 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1cca0 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1ccb0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1ccc0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1ccd0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1cce0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1ccf0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1cd00 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1cd10 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1cd20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1cd30 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1cd40 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1cd50 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1cd60 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1cd70 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1cd80 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1cd90 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1cda0 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1cdb0 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1cdc0 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1cdd0 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1cde0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1cdf0 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1ce00 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1ce10 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1ce20 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1ce30 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1ce40 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1ce50 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1ce60 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1ce70 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1ce80 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1ce90 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1cea0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1ceb0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1cec0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1ced0 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1cee0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1cef0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1cf00 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1cf10 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1cf20 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1cf30 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1cf40 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1cf50 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1cf60 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1cf70 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1cf80 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1cf90 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1cfa0 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1cfb0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1cfc0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1cfd0 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1cfe0 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1cff0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1d000 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1d010 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1d020 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1d030 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1d040 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1d050 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1d060 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1d070 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1d080 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1d090 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1d0a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d0b0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1d0c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d0d0 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1d0e0 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1d0f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d100 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1d110 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1d120 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1d130 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1d140 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1d150 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1d160 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1d170 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1d180 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1d190 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1d1a0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1d1b0 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1d1c0 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1d1d0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1d1e0 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1d1f0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1d200 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1d210 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1d220 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1d230 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1d240 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1d250 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1d260 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1d270 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1d280 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1d290 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1d2a0 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1d2b0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1d2c0 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1d2d0 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1d2e0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1d2f0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1d300 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1d310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d320 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1d330 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1d340 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1d350 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d360 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d370 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1d380 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1d390 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
1d3a0 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
1d3b0 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50  , iPg);.  if( pP
1d3c0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  g ){.    if( sql
1d3d0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
1d3e0 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29  fcount(pPg)==1 )
1d3f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1d400 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
1d410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d420 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1d430 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
1d440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d450 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1d460 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1d470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d480 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d490 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  f(pPg);.    }.  
1d4a0 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  }..  /* Normally
1d4b0 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  , if a transacti
1d4c0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1d4d0 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72  k, any backup pr
1d4e0 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a  ocesses are.  **
1d4f0 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61   updated as data
1d500 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   is copied out o
1d510 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1d520 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20  ournal and into 
1d530 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1d540 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  e. This is not g
1d550 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c  enerally possibl
1d560 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74  e with a WAL dat
1d570 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72  abase, as.  ** r
1d580 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73  ollback involves
1d590 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69   simply truncati
1d5a0 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  ng the log file.
1d5b0 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f   Therefore, if o
1d5c0 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20  ne.  ** or more 
1d5d0 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65  frames have alre
1d5e0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1d5f0 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64   to the log (and
1d600 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a   therefore .  **
1d610 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74   also copied int
1d620 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74  o the backup dat
1d630 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20  abases) as part 
1d640 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1d650 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61  ion,.  ** the ba
1d660 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65  ckups must be re
1d670 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
1d680 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
1d690 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
1d6a0 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ckup);..  return
1d6b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1d6c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1d6d0 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
1d6e0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
1d6f0 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  on a WAL databas
1d700 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d710 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1d720 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d730 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1d760 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  de */.  PgHdr *p
1d770 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1d780 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1d790 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74  of dirty pages t
1d7a0 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f  o revert */..  /
1d7b0 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  * For all pages 
1d7c0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
1d7d0 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
1d7e0 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c  dirty or have al
1d7f0 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
1d800 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74  written (but not
1d810 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74   committed) to t
1d820 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20  he log file, do 
1d830 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  one of the .  **
1d840 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
1d850 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72  .  **   + Discar
1d860 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67  d the cached pag
1d870 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d  e (if refcount==
1d880 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20  0), or.  **   + 
1d890 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  Reload page cont
1d8a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1d8b0 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75  abase (if refcou
1d8c0 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50  nt>0)..  */.  pP
1d8d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1d8e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1d8f0 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1d900 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d  3WalUndo(pPager-
1d910 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f  >pWal, pagerUndo
1d920 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
1d930 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69  *)pPager);.  pLi
1d940 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1d950 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1d960 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1d970 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1d980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d990 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1d9a0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1d9b0 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1d9c0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1d9d0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1d9e0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1d9f0 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1da00 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1da10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1da20 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1da30 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1da40 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1da50 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1da60 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1da70 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1da80 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1da90 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1daa0 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1dab0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1dac0 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1dad0 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1dae0 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1daf0 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1db00 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1db10 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1db20 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1db30 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1db40 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1db50 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1db60 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1db70 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1db80 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1db90 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1dba0 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1dbb0 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1dbc0 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1dbd0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1dbe0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1dbf0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1dc00 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1dc10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1dc20 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1dc30 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1dc40 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1dc50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1dc60 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1dc70 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1dc80 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20   int isCommit,  
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1dcb0 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1dcc0 20 20 69 6e 74 20 73 79 6e 63 46 6c 61 67 73 20    int syncFlags 
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
1dcf0 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29 20 28  ss to OsSync() (
1dd00 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  or 0) */.){.  in
1dd10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1dd40 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1dd50 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1dd60 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43  ined(SQLITE_CHEC
1dd70 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64 72  K_PAGES).  PgHdr
1dd80 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1dd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1dda0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
1ddb0 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ages */.#endif..
1ddc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ddd0 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1dde0 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1ddf0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1de00 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1de10 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1de20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1de30 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1de40 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1de50 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1de60 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1de70 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1de80 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1de90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
1dea0 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1deb0 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1dec0 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1ded0 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1dee0 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1def0 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1df00 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1df10 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1df20 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1df30 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1df40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1df50 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1df60 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1df70 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1df80 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1df90 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1dfa0 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1dfb0 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72  dr *p;.    PgHdr
1dfc0 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69   **ppNext = &pLi
1dfd0 73 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  st;.    for(p=pL
1dfe0 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1dff0 70 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  p); p=p->pDirty)
1e000 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1e010 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29  gno<=nTruncate )
1e020 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44   ppNext = &p->pD
1e030 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
1e040 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1e050 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73  .  }..  if( pLis
1e060 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
1e070 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1e080 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20  ounter(pList);. 
1e090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e0a0 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70  Frames(pPager->p
1e0b0 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67  Wal, .      pPag
1e0c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c  er->pageSize, pL
1e0d0 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20  ist, nTruncate, 
1e0e0 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 46 6c  isCommit, syncFl
1e0f0 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
1e100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e110 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
1e120 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1e130 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1e140 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1e150 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e160 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1e170 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1e180 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1e190 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1e1a0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e1b0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1e1c0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e1d0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e1e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e1f0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e200 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e210 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1e220 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1e230 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1e240 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1e250 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1e260 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1e270 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e280 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1e290 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1e2a0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1e2b0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1e2c0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1e2d0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1e2e0 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1e2f0 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1e300 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1e310 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1e320 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1e330 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1e340 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1e350 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1e360 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1e370 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1e380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e390 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1e3a0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1e3b0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1e3c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e3e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e3f0 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e410 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1e420 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1e430 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1e440 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1e450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e460 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e470 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1e480 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1e490 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1e4a0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1e4b0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1e4c0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1e4d0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1e4e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1e4f0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1e500 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1e510 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1e520 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1e530 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1e540 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1e550 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1e560 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1e570 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1e580 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1e590 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1e5a0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1e5b0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1e5c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1e5d0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1e5e0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1e5f0 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1e600 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1e610 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1e620 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1e630 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
1e640 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e650 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1e660 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e670 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1e680 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1e690 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1e6a0 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1e6b0 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1e6c0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1e6d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e6e0 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1e6f0 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1e700 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1e710 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1e720 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1e730 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1e740 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1e750 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1e760 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1e770 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1e780 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1e790 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1e7a0 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1e7b0 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1e7c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1e7d0 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1e7e0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1e7f0 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1e800 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e810 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1e820 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1e830 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1e840 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e860 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1e870 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1e880 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1e890 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1e8a0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1e8b0 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1e8c0 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1e8d0 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1e8e0 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1e8f0 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1e900 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1e910 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1e920 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1e930 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1e940 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1e950 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1e960 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1e970 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1e980 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1e990 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1e9a0 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1e9b0 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1e9c0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1e9d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1e9e0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1e9f0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1ea00 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1ea10 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ARED_LOCK || pPa
1ea20 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1ea30 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
1ea40 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1ea50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1ea60 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
1ea70 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20  se size was not 
1ea80 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1ea90 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1eaa0 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  m,.  ** determin
1eab0 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68  e it based on th
1eac0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1ead0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1eae0 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66  the size.  ** of
1eaf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1eb00 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  le is not an int
1eb10 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
1eb20 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a   the page-size,.
1eb30 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20    ** round down 
1eb40 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 70  to the nearest p
1eb50 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79  age. Except, any
1eb60 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61   file larger tha
1eb70 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  n 0.  ** bytes i
1eb80 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
1eb90 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ered to contain 
1eba0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67  at least one pag
1ebb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  e..  */.  if( nP
1ebc0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36  age==0 ){.    i6
1ebd0 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ebf0 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69  ize of db file i
1ec00 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61  n bytes */.    a
1ec10 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1ec20 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1ec30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1ec40 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
1ec50 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1ec60 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
1ec70 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1ec80 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b  pPager->fd, &n);
1ec90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1eca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ecb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ecc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ecd0 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
1ece0 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65  n / pPager->page
1ecf0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Size);.    if( n
1ed00 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30 20 29  Page==0 && n>0 )
1ed10 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1ed20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1ed30 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1ed40 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1ed50 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1ed60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1ed70 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1ed80 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1ed90 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1eda0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1edb0 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1edc0 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1edd0 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1ede0 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1edf0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1ee00 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1ee10 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1ee20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1ee30 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1ee40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1ee50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1ee60 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1ee70 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1ee80 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1ee90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1eea0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1eeb0 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1eec0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1eed0 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1eee0 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1eef0 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1ef00 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1ef10 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
1ef20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ef30 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
1ef40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1ef50 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
1ef60 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
1ef70 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
1ef80 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
1ef90 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
1efa0 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
1efb0 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
1efc0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
1efd0 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
1efe0 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
1eff0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
1f000 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
1f010 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
1f020 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
1f030 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f040 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1f050 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
1f060 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
1f070 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
1f080 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f090 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
1f0a0 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
1f0b0 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
1f0c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
1f0d0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
1f0e0 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
1f0f0 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
1f100 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
1f110 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
1f120 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
1f130 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
1f140 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
1f150 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
1f160 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
1f170 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
1f180 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1f190 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1f1a0 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
1f1b0 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
1f1c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f1d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f1e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f1f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f200 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1f210 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1f220 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50  HARED_LOCK || pP
1f230 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
1f240 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
1f250 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1f260 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
1f290 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
1f2a0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1f2d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1f2e0 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
1f2f0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1f300 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1f310 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f320 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
1f330 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
1f340 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1f350 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
1f360 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
1f370 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d  );.      isWal =
1f380 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1f390 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f3a0 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
1f3b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66       pPager->pVf
1f3c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
1f3d0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1f3e0 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20  XISTS, &isWal.  
1f3f0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
1f400 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1f420 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  isWal ){.       
1f430 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1f440 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
1f450 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1f460 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e)==0 );.       
1f470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f480 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72  erOpenWal(pPager
1f490 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
1f4a0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1f4b0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
1f4c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
1f4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1f4e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
1f4f0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
1f500 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
1f510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1f520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1f530 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
1f540 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
1f550 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
1f560 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
1f570 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
1f580 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
1f590 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f5a0 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
1f5b0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
1f5c0 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
1f5d0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
1f5e0 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
1f5f0 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
1f600 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
1f610 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
1f620 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
1f630 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
1f640 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
1f650 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
1f660 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
1f670 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
1f680 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
1f690 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
1f6a0 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
1f6b0 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
1f6c0 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
1f6d0 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
1f6e0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
1f6f0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
1f700 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1f710 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
1f720 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
1f730 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1f740 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
1f750 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
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 2c 20 6f 72 20  .iHdrOffset, or 
1f780 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1f790 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
1f7a0 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
1f7b0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1f7c0 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
1f7d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
1f7e0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1f7f0 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
1f800 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
1f810 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
1f820 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
1f830 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1f840 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
1f850 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
1f860 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
1f870 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
1f880 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1f890 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
1f8a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
1f8b0 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
1f8c0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
1f8d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1f8e0 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
1f8f0 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
1f900 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
1f910 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
1f920 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
1f930 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
1f940 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
1f950 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
1f960 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
1f970 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
1f980 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
1f990 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
1f9a0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
1f9b0 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
1f9c0 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
1f9d0 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
1f9e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1f9f0 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
1fa00 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
1fa10 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
1fa20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
1fa30 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
1fa40 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
1fa50 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
1fa60 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1fa70 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
1fa80 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
1fa90 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
1faa0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
1fab0 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
1fac0 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
1fad0 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
1fae0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
1faf0 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
1fb00 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
1fb10 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
1fb20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
1fb30 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
1fb40 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
1fb50 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
1fb60 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1fb70 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
1fb80 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
1fb90 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
1fba0 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
1fbb0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
1fbc0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
1fbd0 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
1fbe0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1fbf0 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
1fc00 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
1fc10 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
1fc20 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
1fc30 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
1fc40 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
1fc50 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
1fc60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc70 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
1fc80 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
1fc90 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
1fca0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
1fcb0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
1fcc0 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
1fcd0 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
1fce0 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
1fcf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1fd00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1fd10 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
1fd20 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
1fd30 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
1fd40 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
1fd50 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
1fd60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1fd70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1fd80 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
1fd90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fda0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1fdb0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a  ITER_LOCKED );..
1fdc0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1fdd0 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
1fde0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
1fdf0 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
1fe00 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
1fe10 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
1fe20 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
1fe30 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
1fe40 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
1fe50 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
1fe60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1fe70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1fe80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
1fe90 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1fea0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
1feb0 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
1fec0 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
1fed0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
1fee0 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
1fef0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1ff00 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
1ff10 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
1ff20 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
1ff30 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1ff40 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1ff50 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1ff60 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1ff70 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
1ff80 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
1ff90 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
1ffa0 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
1ffb0 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  kWal(pPager);.  
1ffc0 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
1ffd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
1ffe0 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1fff0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20000 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
20010 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
20020 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
20030 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
20040 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
20050 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
20060 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
20070 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
20080 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
20090 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
200a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
200b0 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
200c0 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
200d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
200e0 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
200f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20100 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
20110 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
20120 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
20130 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
20140 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
20150 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
20160 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
20170 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
20180 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
20190 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
201a0 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
201b0 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
201c0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
201d0 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
201e0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
201f0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
20200 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
20210 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
20220 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
20230 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
20240 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
20250 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
20260 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
20270 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
20280 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
20290 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
202a0 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
202b0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
202c0 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
202d0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
202e0 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
202f0 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
20300 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20310 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
20320 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
20330 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
20340 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
20350 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
20360 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
20370 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
20380 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
20390 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
203a0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
203b0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
203c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
203d0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
203e0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
203f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
20400 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
20410 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
20420 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
20430 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20440 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20450 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
20460 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
20470 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
20480 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
20490 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
204a0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
204b0 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
204c0 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
204d0 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
204e0 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
204f0 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
20500 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
20510 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
20520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20530 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20540 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
20550 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
20560 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20570 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
20580 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
20590 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
205a0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
205b0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
205c0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
205d0 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
205e0 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
205f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
20600 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
20610 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
20620 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
20630 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
20640 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
20650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20660 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
20670 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
20680 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
20690 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
206a0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
206b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
206c0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
206d0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
206e0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
206f0 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
20700 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
20710 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
20720 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
20730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20740 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
20750 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
20760 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
20770 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
20780 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
20790 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
207a0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
207b0 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
207c0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
207d0 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
207e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
207f0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
20800 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
20810 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
20820 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
20830 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20840 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
20850 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
20860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20870 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
20880 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff>=szJ );.. 
20890 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
208a0 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
208b0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
208c0 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
208d0 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
208e0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
208f0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
20900 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
20910 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
20920 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
20930 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
20940 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
20950 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
20960 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20970 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
20980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
20990 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
209a0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
209b0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
209c0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
209d0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
209e0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
209f0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
20a00 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
20a10 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
20a20 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
20a30 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
20a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20a50 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
20a60 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
20a70 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
20a80 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
20a90 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
20aa0 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b  ( offset==ii*(4+
20ab0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20ac0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
20ad0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
20ae0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
20af0 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20  &offset, pDone, 
20b00 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 1);.    }.   
20b10 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20b20 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
20b30 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
20b40 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
20b50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20b60 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
20b70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20b80 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  szJ;.  }..  retu
20b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20ba0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
20bb0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
20bc0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
20bd0 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
20be0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
20bf0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
20c00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
20c10 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
20c20 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
20c30 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
20c40 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
20c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
20c60 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
20c70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20c80 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
20c90 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
20ca0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
20cb0 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
20cc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
20cd0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
20ce0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
20cf0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
20d00 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
20d10 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
20d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
20d30 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
20d40 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
20d50 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
20d70 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
20d80 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
20d90 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
20da0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
20db0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
20dc0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
20dd0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
20de0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
20df0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
20e00 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
20e10 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
20e30 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
20e40 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
20e50 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
20e60 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
20e70 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
20e80 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
20e90 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
20ea0 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
20eb0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
20ec0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
20ed0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
20ee0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
20ef0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
20f00 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
20f10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
20f20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
20f30 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
20f40 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
20f50 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
20f60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20f70 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
20f80 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
20f90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
20fa0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
20fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
20fd0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
20fe0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
20ff0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
21000 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
21010 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
21020 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
21030 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
21040 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
21050 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
21060 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
21070 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21080 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
21090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
210a0 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
210b0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
210c0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
210d0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
210e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
210f0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
21100 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
21110 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
21120 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
21130 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
21140 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
21150 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
21160 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
21170 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
21180 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
21190 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
211a0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
211b0 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
211c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
211d0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
211e0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
211f0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
21200 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
21210 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
21220 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
21230 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
21240 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
21250 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
21260 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
21270 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
21280 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
21290 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
212a0 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
212b0 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
212c0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
212d0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
212e0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
212f0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
21300 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
21310 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
21320 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
21330 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
21340 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
21350 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
21360 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
21370 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
21380 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
21390 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
213a0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
213b0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
213c0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
213d0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
213e0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
213f0 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
21400 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
21410 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
21420 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
21430 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
21440 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
21450 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
21460 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
21470 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
21480 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
21490 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
214a0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
214b0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
214c0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
214d0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
214e0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
214f0 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
21500 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
21510 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
21520 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
21530 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
21540 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
21550 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
21560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
21570 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
21580 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
21590 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67  fetyLevel(.  Pag
215a0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
215b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
215c0 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
215d0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  vel for */.  int
215e0 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20   level,         
215f0 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e     /* PRAGMA syn
21600 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46  chronous.  1=OFF
21610 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55  , 2=NORMAL, 3=FU
21620 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46  LL */  .  int bF
21630 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20  ullFsync,       
21640 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73  /* PRAGMA fullfs
21650 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b  ync */.  int bCk
21660 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f  ptFullFsync    /
21670 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  * PRAGMA checkpo
21680 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  int_fullfsync */
21690 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65  .){.  assert( le
216a0 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c  vel>=1 && level<
216b0 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =3 );.  pPager->
216c0 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
216d0 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
216e0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
216f0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
21700 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
21710 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
21720 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20  le) ?1:0;.  if( 
21730 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
21740 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
21750 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ncFlags = 0;.   
21760 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21770 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  cFlags = 0;.  }e
21780 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79  lse if( bFullFsy
21790 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
217a0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
217b0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
217c0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
217d0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
217e0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
217f0 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46  }else if( bCkptF
21800 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20  ullFsync ){.    
21810 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
21820 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21830 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
21840 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
21850 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21860 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
21870 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
21880 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
21890 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
218a0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
218b0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
218c0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d  NC_NORMAL;.  }.}
218d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
218e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
218f0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
21900 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
21910 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
21920 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
21930 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
21940 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
21950 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
21960 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
21970 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
21980 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
21990 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
219a0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
219b0 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
219c0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
219d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
219e0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
219f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21a00 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
21a10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
21a20 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
21a30 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
21a40 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
21a50 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
21a60 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
21a70 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
21a80 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
21a90 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
21aa0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
21ab0 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
21ac0 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
21ad0 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
21ae0 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
21af0 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
21b00 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
21b10 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
21b20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
21b30 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
21b40 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
21b50 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
21b60 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
21b70 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
21b80 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
21b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
21ba0 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
21bb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
21bc0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
21bd0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
21be0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
21bf0 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
21c00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
21c10 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
21c20 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
21c30 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
21c40 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
21c50 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
21c60 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
21c70 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
21c80 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
21c90 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
21ca0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
21cb0 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
21cc0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
21cd0 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
21ce0 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
21cf0 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
21d00 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
21d10 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
21d20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
21d30 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
21d40 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
21d50 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
21d60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
21d70 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
21d80 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
21d90 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
21da0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21db0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
21dc0 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
21dd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
21de0 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
21df0 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
21e00 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
21e10 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
21e20 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
21e30 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
21e40 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
21e50 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
21e60 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
21e70 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
21e80 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
21e90 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
21ea0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
21eb0 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
21ec0 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
21ed0 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
21ee0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
21ef0 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
21f00 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
21f10 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
21f20 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
21f30 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
21f40 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
21f50 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
21f60 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
21f70 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
21f80 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
21f90 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
21fc0 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
21fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22000 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
22010 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
22020 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
22030 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
22040 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
22050 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
22060 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
22070 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
22080 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
22090 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
220a0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
220b0 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
220c0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
220d0 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
220e0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
220f0 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
22100 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
22110 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
22120 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
22130 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
22140 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
22150 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
22160 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
22170 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22180 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
22190 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
221a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
221b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
221c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
221d0 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
221e0 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
221f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22200 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
22210 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
22220 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22240 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
22250 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
22260 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50  ler */.){  .  pP
22270 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
22280 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
22290 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
222a0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
222b0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
222c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
222d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
222e0 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
222f0 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
22300 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
22310 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
22320 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
22330 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
22340 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
22350 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
22360 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
22370 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
22380 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
22390 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
223a0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
223b0 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
223c0 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
223d0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
223e0 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20  xxx sub-code or 
223f0 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
22400 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
22410 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
22420 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
22430 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
22440 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
22450 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
22460 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
22470 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
22480 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
22490 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
224a0 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
224b0 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
224c0 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
224d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
224e0 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
224f0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
22500 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
22510 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
22520 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
22530 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
22540 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
22550 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
22560 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
22570 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
22580 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
22590 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
225a0 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
225b0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
225c0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
225d0 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
225e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
225f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
22600 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
22610 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
22620 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
22630 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
22640 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
22650 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
22660 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
22670 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
22680 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
22690 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
226a0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
226b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
226c0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
226d0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
226e0 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
226f0 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
22700 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
22710 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
22720 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
22730 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
22740 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
22750 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
22760 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
22770 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
22780 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
22790 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
227a0 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
227b0 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
227c0 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
227d0 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
227e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
227f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22800 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
22810 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20  er *pPager, u32 
22820 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
22830 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
22840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22850 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
22860 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20   possible to do 
22870 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61  a full assert_pa
22880 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65  ger_state() here
22890 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  , as this.  ** f
228a0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
228b0 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
228c0 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62  n PagerOpen(), b
228d0 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a  efore the state.
228e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65    ** of the Page
228f0 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65  r object is inte
22900 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e  rnally consisten
22910 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20  t..  **.  ** At 
22920 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66  one point this f
22930 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
22940 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
22950 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20   pager was in . 
22960 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
22970 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65  state. But since
22980 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
22990 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  te guarantees th
229a0 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  at.  ** there is
229b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
229c0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
229d0 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66  eference, this f
229e0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
229f0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74  a no-op for that
22a00 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20   case anyhow..  
22a10 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69  */..  u32 pageSi
22a20 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
22a30 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
22a40 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
22a50 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
22a60 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
22a70 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
22a80 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
22a90 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
22aa0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
22ab0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
22ac0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
22ad0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
22ae0 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
22af0 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70  pageSize!=(u32)p
22b00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
22b10 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
22b20 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pNew = NULL;    
22b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
22b40 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20  temp space */.  
22b50 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b    i64 nByte = 0;
22b60 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
22b70 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
22b80 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50  PEN && isOpen(pP
22b90 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
22ba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22bb0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
22bc0 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  ->fd, &nByte);. 
22bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
22be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22bf0 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72      pNew = (char
22c00 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
22c10 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
22c20 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
22c30 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
22c40 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  MEM;.    }..    
22c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22c60 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
22c70 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
22c80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
22c90 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 6e 42  Size = (Pgno)(nB
22ca0 79 74 65 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  yte/pageSize);. 
22cb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
22cc0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
22cd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
22ce0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
22cf0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
22d00 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
22d10 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
22d20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22d30 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
22d40 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
22d50 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Size);.    }.  }
22d60 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
22d70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22d80 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
22d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
22da0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
22db0 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
22dc0 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
22dd0 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
22de0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
22df0 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
22e00 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
22e10 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
22e20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
22e30 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
22e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22e50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22e60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
22e70 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
22e80 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
22e90 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
22ea0 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
22eb0 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
22ec0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
22ed0 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
22ee0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
22ef0 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
22f00 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
22f10 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
22f20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
22f30 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
22f40 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
22f50 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
22f60 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
22f70 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
22f80 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
22f90 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
22fa0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
22fb0 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
22fc0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
22fd0 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
22fe0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
22ff0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
23000 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
23010 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
23020 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
23030 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
23040 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
23050 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
23060 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
23070 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
23080 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
23090 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
230a0 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
230b0 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
230c0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
230d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
230e0 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
230f0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
23100 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
23110 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
23120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23130 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
23140 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23150 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
23160 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
23170 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
23180 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
23190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
231a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
231b0 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43  PEN );      /* C
231c0 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50  alled only by OP
231d0 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61  _MaxPgcnt */.  a
231e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
231f0 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64  xPgno>=pPager->d
23200 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f  bSize );  /* OP_
23210 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65  MaxPgcnt enforce
23220 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75  s this */.  retu
23230 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
23240 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
23250 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
23260 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
23270 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
23280 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
23290 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
232a0 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
232b0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
232c0 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
232d0 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
232e0 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
232f0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
23300 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
23310 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
23320 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
23330 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
23340 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
23350 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
23360 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
23370 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
23380 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
23390 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
233a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
233b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
233c0 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
233d0 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
233e0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
233f0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
23400 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
23410 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
23420 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
23430 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23440 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
23450 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23460 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
23470 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
23480 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
23490 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
234a0 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
234b0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
234c0 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
234d0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
234e0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
234f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
23500 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
23510 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
23520 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
23530 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
23540 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
23550 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
23560 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
23570 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
23580 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
23590 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
235a0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
235b0 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
235c0 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
235d0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
235e0 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
235f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23600 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
23610 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
23620 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
23630 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
23640 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
23650 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
23660 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
23670 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
23680 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
23690 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
236a0 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
236b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
236c0 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
236d0 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
236e0 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
236f0 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
23700 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
23710 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
23720 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
23730 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
23740 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
23750 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
23760 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
23770 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
23780 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
23790 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
237a0 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
237b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
237c0 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
237d0 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
237e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
237f0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
23800 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
23810 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
23820 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
23830 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
23840 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
23850 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
23860 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
23870 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
23880 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
23890 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
238a0 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
238b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
238c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
238d0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
238e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
238f0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
23900 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
23910 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
23920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23930 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
23940 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
23950 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23960 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
23970 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
23980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23990 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
239a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
239b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
239c0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
239d0 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
239e0 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
239f0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
23a00 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
23a10 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
23a20 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
23a30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
23a40 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
23a50 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
23a60 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
23a70 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
23a80 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
23a90 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
23aa0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
23ab0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
23ac0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
23ad0 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
23ae0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
23af0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
23b00 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
23b10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
23b20 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
23b30 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
23b40 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
23b50 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
23b60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
23b70 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
23b80 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
23b90 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23ba0 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
23bb0 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
23bc0 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
23bd0 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
23be0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
23bf0 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
23c00 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
23c10 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
23c20 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
23c30 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
23c40 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
23c50 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
23c60 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
23c70 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
23c80 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
23c90 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
23ca0 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
23cb0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
23cc0 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
23cd0 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
23ce0 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
23cf0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
23d00 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
23d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
23d20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
23d30 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
23d40 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
23d50 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
23d60 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
23d70 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
23d80 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
23d90 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
23da0 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
23db0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
23dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
23dd0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
23de0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23df0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
23e00 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
23e30 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
23e40 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
23e50 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
23e60 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
23e70 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
23e80 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
23e90 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
23ea0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
23eb0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
23ec0 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
23ed0 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
23ee0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
23ef0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
23f00 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
23f10 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
23f20 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23f30 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
23f40 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
23f50 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
23f60 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
23f70 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
23f80 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
23f90 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
23fa0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
23fb0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
23fc0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
23fd0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
23fe0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
23ff0 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
24000 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
24010 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
24020 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24030 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
24040 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
24050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24060 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
24070 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
24080 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
24090 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
240a0 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
240b0 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
240c0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
240d0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
240e0 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
240f0 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
24100 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
24110 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
24120 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24130 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
24140 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
24150 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
24160 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
24170 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
24180 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
24190 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
241a0 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
241b0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
241c0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
241d0 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
241e0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
241f0 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
24200 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
24210 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
24220 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
24230 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
24240 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
24250 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
24260 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
24270 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
24280 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
24290 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
242a0 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
242b0 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
242c0 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
242d0 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
242e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
242f0 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
24300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24310 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
24320 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
24330 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
24340 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
24350 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
24360 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
24370 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
24380 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
24390 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
243a0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
243b0 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
243c0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
243d0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
243e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
243f0 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
24400 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
24410 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
24420 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
24430 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
24440 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
24450 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
24460 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
24470 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
24480 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
24490 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
244a0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
244b0 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
244c0 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
244d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
244e0 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
244f0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
24500 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
24510 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
24520 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
24530 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
24540 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
24550 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
24560 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
24570 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
24580 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
24590 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
245a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
245b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
245c0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
245d0 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
245e0 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
245f0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24600 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
24610 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
24620 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24630 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
24640 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
24650 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
24660 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
24670 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
24680 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
24690 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
246a0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
246b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
246c0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
246d0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
246e0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
246f0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
24700 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
24710 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
24720 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
24730 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
24740 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
24750 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
24760 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
24770 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
24780 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
24790 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
247a0 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
247b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
247c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
247d0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
247e0 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
247f0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
24800 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  .  assertTruncat
24810 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
24820 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  er);.}.../*.** T
24830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24840 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
24850 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
24860 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
24870 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
24880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
24890 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
248a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
248b0 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
248c0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
248d0 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
248e0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
248f0 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
24900 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
24910 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
24920 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
24930 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
24940 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
24950 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
24960 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
24970 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
24980 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
24990 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
249a0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
249b0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
249c0 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
249d0 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
249e0 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
249f0 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
24a00 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
24a10 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
24a20 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
24a30 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
24a40 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
24a50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
24a60 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
24a70 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
24a80 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
24a90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
24aa0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
24ab0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24ac0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24ad0 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
24ae0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
24af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
24b00 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
24b10 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
24b20 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
24b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24b40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24b50 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
24b60 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
24b70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
24b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24b90 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
24ba0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
24bb0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
24bc0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
24bd0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
24be0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
24bf0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
24c00 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24c10 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
24c20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
24c30 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
24c40 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
24c50 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
24c60 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
24c70 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
24c80 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
24c90 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
24ca0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
24cb0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
24cc0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
24cd0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
24ce0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
24cf0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
24d00 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
24d10 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
24d20 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
24d30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
24d40 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
24d50 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
24d60 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
24d70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
24d80 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
24d90 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
24da0 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
24db0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
24dc0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
24dd0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
24de0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
24df0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24e00 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
24e10 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70  ger){.  u8 *pTmp
24e20 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
24e30 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61  >pTmpSpace;..  a
24e40 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
24e50 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
24e60 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
24e70 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24e80 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
24e90 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
24ea0 28 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ();.  /* pPager-
24eb0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f  >errCode = 0; */
24ec0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
24ed0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69  siveMode = 0;.#i
24ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24ef0 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57  T_WAL.  sqlite3W
24f00 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  alClose(pPager->
24f10 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b  pWal, pPager->ck
24f20 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61  ptSyncFlags, pPa
24f30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
24f40 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Tmp);.  pPager->
24f50 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pWal = 0;.#endif
24f60 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
24f70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
24f80 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
24f90 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
24fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24fb0 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20   If it is open, 
24fc0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
24fd0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
24fe0 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  ling UnlockAndRo
24ff0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49  llback..    ** I
25000 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f  f this is not do
25010 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79  ne, then an unsy
25020 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
25030 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
25040 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61   .    ** file ma
25050 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  y be played back
25060 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
25070 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
25080 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20  ailure occurs . 
25090 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73     ** while this
250a0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
250b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
250c0 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
250d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
250e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
250f0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
25100 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
25110 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70  nal, shift the p
25120 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ager.    ** into
25130 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
25140 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e  . This causes Un
25150 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20  lockAndRollback 
25160 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20  to unlock the.  
25170 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e    ** database an
25180 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  d close the jour
25190 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74  nal file without
251a0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
251b0 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61  oll it.    ** ba
251c0 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69  ck or finalize i
251d0 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61  t. The next data
251e0 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68  base user will h
251f0 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f  ave to do hot-jo
25200 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c  urnal.    ** rol
25210 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63  lback before acc
25220 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
25230 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
25240 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
25250 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
25260 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
25270 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
25280 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
25290 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
252a0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
252b0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
252c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
252d0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
252e0 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
252f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
25300 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
25310 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
25320 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
25330 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
25340 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
25350 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  )).  sqlite3OsCl
25360 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
25370 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
25380 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
25390 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
253a0 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
253b0 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
253c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
253d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
253e0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
253f0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
25400 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
25410 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
25420 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
25430 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
25440 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
25450 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
25460 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
25470 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
25480 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
25490 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
254a0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
254b0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
254c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
254d0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
254e0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
254f0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
25500 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25510 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
25520 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
25530 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
25540 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
25550 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
25560 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
25570 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
25580 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
25590 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
255a0 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
255b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
255c0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
255d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
255e0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
255f0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
25600 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
25610 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
25620 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
25630 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
25640 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
25650 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
25660 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
25670 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
25680 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
25690 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
256a0 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
256b0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
256c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
256d0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
256e0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
256f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
25700 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
25710 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
25720 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
25730 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
25740 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
25750 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
25760 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68  istics of the th
25770 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
25780 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
25790 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
257a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
257b0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
257c0 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
257d0 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
257e0 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
257f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
25800 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
25810 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
25820 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
25830 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
25840 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
25850 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
25860 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
25870 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
25880 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
25890 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
258a0 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
258b0 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
258c0 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
258d0 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
258e0 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
258f0 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
25900 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
25910 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
25920 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25930 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
25940 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
25950 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
25960 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
25970 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
25980 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
25990 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
259a0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
259b0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
259c0 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
259d0 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
259e0 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
259f0 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
25a00 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
25a10 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
25a20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
25a30 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
25a40 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
25a50 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
25a60 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
25a70 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
25a80 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
25a90 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
25aa0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
25ab0 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
25ac0 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
25ad0 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
25ae0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
25af0 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
25b00 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
25b10 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
25b20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25b30 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
25b40 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
25b50 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
25b60 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
25b70 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
25b80 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
25b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
25ba0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
25bb0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
25bc0 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25bf0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
25c00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25c10 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
25c20 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
25c30 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
25c40 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
25c50 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
25c60 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
25c70 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
25c80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
25c90 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
25ca0 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
25cb0 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
25cc0 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
25cd0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
25ce0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
25cf0 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
25d00 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
25d10 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
25d20 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
25d30 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
25d40 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
25d50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
25d60 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
25d70 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
25d80 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
25d90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
25da0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
25db0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
25dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
25dd0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25de0 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
25df0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
25e00 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
25e10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
25e20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
25e30 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
25e40 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
25e50 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
25e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
25e70 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
25e80 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
25e90 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
25ea0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
25eb0 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
25ec0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25ed0 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
25ee0 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
25ef0 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
25f00 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
25f10 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
25f20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
25f30 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
25f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
25f50 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
25f60 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
25f70 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
25f80 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
25f90 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
25fa0 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
25fb0 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
25fc0 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
25fd0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
25fe0 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
25ff0 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
26000 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
26010 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
26020 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
26030 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
26040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
26050 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
26060 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
26070 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
26080 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
26090 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
260a0 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
260b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
260c0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
260d0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
260e0 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
260f0 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
26100 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
26110 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
26120 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
26130 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
26140 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
26150 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
26160 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
26170 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
26180 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
26190 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
261a0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
261b0 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
261c0 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
261d0 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
261e0 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
261f0 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
26200 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
26210 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
26220 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
26230 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
26240 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
26250 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
26260 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
26270 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26280 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
26290 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
262a0 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
262b0 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
262c0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
262d0 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
262e0 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
262f0 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
26300 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
26310 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
26320 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
26330 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
26340 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
26350 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
26360 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
26370 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
26380 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
26390 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
263a0 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
263b0 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
263c0 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
263d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
263e0 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
263f0 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
26400 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
26410 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
26420 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
26430 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
26440 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
26450 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
26460 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
26470 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
26480 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
26490 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
264a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
264b0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
264c0 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
264d0 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
264e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
264f0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
26500 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
26510 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
26520 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
26530 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
26540 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
26550 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26560 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
26570 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
26580 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
26590 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
265a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
265b0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
265c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
265d0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
265e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
265f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
26600 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
26610 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
26620 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
26630 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
26640 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
26650 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
26660 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
26670 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
26680 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
26690 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
266a0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
266b0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
266c0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
266d0 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
266e0 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
266f0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
26700 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26710 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
26720 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
26730 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
26740 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
26750 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
26760 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
26770 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
26780 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
26790 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
267a0 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
267b0 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
267c0 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
267d0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
267e0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
267f0 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
26800 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
26810 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
26820 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
26830 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
26840 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
26850 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
26860 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
26870 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
26880 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
26890 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
268a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
268b0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
268c0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
268d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
268e0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
268f0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
26900 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
26910 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26920 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
26930 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
26940 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
26950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26960 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
26970 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
26980 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
26990 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
269a0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
269b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
269c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
269d0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
269e0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
269f0 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
26a00 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
26a10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26a20 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
26a30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26a40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
26a50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
26a60 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
26a70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
26a80 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
26a90 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
26aa0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
26ab0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
26ac0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
26ad0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
26ae0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
26af0 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
26b00 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
26b10 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
26b20 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
26b30 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
26b40 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
26b50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
26b60 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
26b70 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
26b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
26b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26ba0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
26bb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
26bc0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
26bd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
26be0 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
26bf0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
26c00 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
26c10 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
26c20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
26c30 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
26c40 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
26c50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
26c60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26c70 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
26c90 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
26ca0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
26cb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
26cd0 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
26ce0 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
26cf0 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
26d00 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
26d10 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
26d20 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
26d30 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
26d40 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
26d50 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
26d60 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
26d70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
26d80 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
26d90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
26da0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
26db0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
26dc0 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
26dd0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
26de0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
26df0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
26e10 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
26e20 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
26e30 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
26e40 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
26e50 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
26e60 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
26e70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
26e80 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
26e90 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
26ea0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
26eb0 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
26ec0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
26ed0 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
26ee0 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
26ef0 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
26f00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
26f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
26f20 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
26f30 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
26f40 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
26f50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
26f60 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
26f70 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
26f80 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
26f90 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
26fa0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
26fb0 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
26fc0 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
26fd0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
26fe0 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
26ff0 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
27000 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
27010 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
27020 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
27030 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27040 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
27050 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
27060 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
27070 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
27080 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
27090 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
270a0 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
270b0 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
270c0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
270d0 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
270e0 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
270f0 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
27100 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
27110 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
27120 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
27130 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
27140 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
27150 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
27160 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
27170 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
27180 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
27190 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
271a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
271b0 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
271c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
271d0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
271e0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
271f0 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
27200 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
27210 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
27220 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
27230 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
27240 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
27250 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
27260 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
27270 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
27280 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
27290 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
272a0 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
272b0 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
272c0 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
272d0 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
272e0 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
272f0 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
27300 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
27310 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
27320 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
27330 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
27340 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
27350 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
27360 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
27370 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
27380 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
27390 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
273a0 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
273b0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
273c0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
273d0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
273e0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
273f0 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
27400 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
27410 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
27420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27440 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
27450 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
27460 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
27470 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
27480 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
27490 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
274a0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
274b0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
274c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
274d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
274e0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
274f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27500 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
27510 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
27520 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
27530 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
27540 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
27550 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
27560 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
27570 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
27580 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
27590 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
275a0 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
275b0 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
275c0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
275d0 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
275e0 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
275f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
27600 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
27610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27620 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
27630 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
27640 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
27650 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
27660 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
27670 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
27680 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
27690 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
276a0 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
276b0 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
276c0 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
276d0 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
276e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
276f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
27700 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
27710 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
27720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
27730 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50  Pager->dbSize>pP
27740 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
27750 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
27760 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
27770 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
27780 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
27790 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
277a0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
277b0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
277c0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
277d0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
277e0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
277f0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
27800 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
27810 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
27820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27830 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
27840 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
27850 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
27860 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
27870 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
27880 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
27890 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
278a0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
278b0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
278c0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
278d0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
278e0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
278f0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
27900 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
27910 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
27920 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
27930 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
27940 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
27950 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
27960 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
27970 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
27980 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
27990 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
279a0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
279b0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
279c0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
279d0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
279e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
279f0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
27a00 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
27a10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
27a20 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
27a30 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
27a40 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
27a50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
27a60 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
27a70 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
27a80 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27ab0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
27ac0 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
27ad0 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
27ae0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
27af0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
27b00 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
27b10 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
27b20 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
27b30 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  st);..      /* E
27b40 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
27b50 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
27b60 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
27b70 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
27b80 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
27b90 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
27ba0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
27bb0 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
27bc0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
27bd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
27be0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
27bf0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27c00 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
27c10 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
27c20 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
27c30 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
27c40 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
27c50 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
27c60 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
27c70 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
27c80 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
27c90 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
27ca0 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
27cb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27cc0 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
27cd0 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
27ce0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27cf0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
27d00 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
27d10 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
27d20 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
27d30 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
27d40 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
27d50 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
27d60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
27d70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
27d80 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
27d90 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
27da0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
27db0 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
27dc0 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
27dd0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
27de0 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
27df0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
27e00 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
27e10 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
27e20 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
27e30 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
27e40 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
27e50 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
27e60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
27e70 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
27e80 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
27e90 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
27ea0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
27eb0 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
27ec0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
27ed0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
27ee0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
27ef0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
27f00 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
27f10 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
27f20 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
27f30 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
27f40 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
27f50 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
27f60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
27f70 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
27f80 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
27f90 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
27fa0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
27fb0 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
27fc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27fd0 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
27fe0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
27ff0 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
28000 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
28010 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
28020 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
28030 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
28040 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
28050 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
28060 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
28070 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
28080 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
28090 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
280a0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
280b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
280c0 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
280d0 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
280e0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
280f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
28100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
28110 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
28120 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
28130 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
28140 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
28150 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28160 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
28170 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
28180 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
28190 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
281a0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
281b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
281c0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
281d0 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
281e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
281f0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
28200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
28220 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
28230 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
28240 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
28250 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
28260 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
28270 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
28280 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
28290 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
282a0 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
282b0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
282c0 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
282d0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
282e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
282f0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
28300 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
28310 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
28320 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
28330 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
28340 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
28350 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
28360 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28370 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
28380 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
28390 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
283a0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
283b0 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
283c0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
283d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
283e0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
283f0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
28400 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
28410 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
28420 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
28430 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
28440 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
28450 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
28460 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
28470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
28480 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
28490 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
284a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
284b0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
284c0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
284d0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
284e0 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
284f0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
28500 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
28510 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28520 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
28530 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
28540 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28550 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
28560 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
28570 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
28580 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
28590 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
285a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
285b0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
285c0 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
285d0 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
285e0 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
285f0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
28600 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
28610 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
28620 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
28630 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
28640 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
28650 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
28660 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
28670 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
28680 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
28690 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
286a0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
286b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
286c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
286d0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
286e0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
286f0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
28700 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
28710 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
28720 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
28730 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20  r *pData2;.  .  
28740 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
28750 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
28760 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
28770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
28780 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45  ta2);.      PAGE
28790 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
287a0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
287b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
287c0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
287d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
287e0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
287f0 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
28800 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
28810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
28830 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28840 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
28850 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
28860 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
28870 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
28880 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
28890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
288a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
288b0 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
288c0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
288d0 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
288e0 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
288f0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
28900 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
28910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28920 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
28930 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
28940 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
28950 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
28960 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
28970 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
28980 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
28990 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
289a0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
289b0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
289c0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
289d0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
289e0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
289f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
28a00 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
28a10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
28a20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
28a30 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
28a40 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
28a50 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
28a60 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
28a70 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
28a80 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
28a90 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
28aa0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
28ab0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
28ac0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
28ad0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
28ae0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28af0 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
28b00 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
28b10 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
28b20 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
28b30 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
28b40 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
28b50 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
28b60 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
28b70 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
28b80 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
28b90 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
28ba0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
28bb0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
28bc0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
28bd0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
28be0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28bf0 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
28c00 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
28c10 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
28c20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
28c30 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
28c40 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
28c50 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
28c60 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
28c70 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
28c80 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
28c90 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
28ca0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
28cb0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
28cc0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
28cd0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
28ce0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
28cf0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
28d00 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
28d10 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
28d20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
28d30 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
28d40 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
28d50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
28d60 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
28d70 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
28d80 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67  otSyncSpill flag
28d90 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74   is set during t
28da0 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20  imes when doing 
28db0 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a  a sync of.  ** j
28dc0 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69  ournal (and addi
28dd0 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29  ng a new header)
28de0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e   is not allowed.
28df0 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20    This occurs.  
28e00 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20  ** during calls 
28e10 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
28e20 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79  rite() while try
28e30 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d  ing to journal m
28e40 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67  ultiple.  ** pag
28e50 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  es belonging to 
28e60 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e  the same sector.
28e70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
28e80 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69  oNotSpill flag i
28e90 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68  nhibits all cach
28ea0 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72  e spilling regar
28eb0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
28ec0 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73  .  ** or not a s
28ed0 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
28ee0 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75    This is set du
28ef0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
28f00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
28f10 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
28f20 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
28f30 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
28f40 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
28f50 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
28f60 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
28f70 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
28f80 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20  t implementaton 
28f90 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
28fa0 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
28fb0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
28fc0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
28fd0 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a  h createFlag==1.
28fe0 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
28ff0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
29000 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
29010 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
29020 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
29030 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
29040 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
29050 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
29060 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
29070 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
29080 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
29090 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
290a0 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
290b0 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
290c0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
290d0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
290e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
290f0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
29100 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51  pill ) return SQ
29110 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
29120 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
29130 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66  Spill && (pPg->f
29140 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
29150 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20  D_SYNC)!=0 ){.  
29160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29170 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
29180 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
29190 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
291a0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
291b0 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
291c0 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
291d0 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
291e0 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
291f0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
29200 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ){ .      rc = s
29210 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
29220 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69  g); .    }.    i
29230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29240 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
29250 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
29260 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c  ager, pPg, 0, 0,
29270 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
29280 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
29290 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
292a0 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
292b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
292c0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
292d0 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
292e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
292f0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
29300 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
29310 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
29320 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
29330 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
29340 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
29350 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
29360 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
29370 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
29380 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  of.    ** the da
29390 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
293a0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
293b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
293c0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ub-journal..    
293d0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
293e0 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  se the call to p
293f0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
29400 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c  ist() below will
29410 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75   not.    ** actu
29420 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
29430 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
29440 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a  his case..    **
29450 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  .    ** Consider
29460 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
29470 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
29480 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
29490 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a     BEGIN;.    **
294a0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
294b0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
294c0 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
294d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45  .    **     SAVE
294e0 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a  POINT sp;.    **
294f0 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
29500 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29510 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20  Y pages>.    ** 
29520 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
29530 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a  s(page X).    **
29540 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
29550 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20   sp;.    **.    
29560 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
29570 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
29580 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
29590 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
295a0 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f  written.    ** o
295b0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
295c0 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
295d0 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
295e0 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
295f0 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  n,.    ** follow
29600 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
29610 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
29620 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
29630 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20   X will read.   
29640 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
29650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29660 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
29670 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58  e copy of page X
29680 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61   as it.    ** wa
29690 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
296a0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
296b0 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
296c0 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
296d0 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65  ".    ** was exe
296e0 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  cuted..    **.  
296f0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
29700 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
29710 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
29720 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
29730 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a  he .    ** sub-j
29740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
29750 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29760 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
29770 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
29780 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
29790 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
297a0 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
297b0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
297c0 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75  is .    ** execu
297d0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
297e0 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20  if( NEVER(.     
297f0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
29800 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
29810 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
29820 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
29830 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20  (pPg).    ) ){. 
29840 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
29850 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
29860 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
29870 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
29880 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
29890 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
298a0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
298b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
298c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
298d0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
298e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
298f0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
29900 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
29910 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
29920 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
29930 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
29940 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
29950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29960 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
29970 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
29980 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
29990 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
299a0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
299b0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
299c0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
299d0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
299e0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
299f0 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ; .}.../*.** All
29a00 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
29a10 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
29a20 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
29a30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
29a40 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
29a50 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
29a60 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
29a70 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
29a80 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
29a90 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
29aa0 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
29ab0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
29ac0 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
29ad0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
29ae0 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
29af0 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
29b00 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
29b10 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
29b20 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
29b30 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
29b40 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
29b50 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
29b60 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
29b70 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
29b80 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
29b90 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
29ba0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
29bb0 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
29bc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
29bd0 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
29be0 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
29bf0 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
29c00 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
29c10 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
29c20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
29c30 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
29c40 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
29c50 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
29c60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
29c70 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
29c80 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
29c90 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
29ca0 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
29cb0 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
29cc0 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
29cd0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
29ce0 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
29cf0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
29d00 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
29d10 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
29d20 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
29d30 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
29d40 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
29d50 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
29d60 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
29d70 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
29d80 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
29d90 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
29da0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
29db0 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
29dc0 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
29dd0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
29de0 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
29df0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
29e00 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
29e10 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
29e20 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
29e30 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
29e40 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
29e50 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
29e60 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
29e70 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
29e80 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
29e90 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
29ea0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29eb0 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
29ec0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
29ed0 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
29ee0 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
29ef0 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
29f00 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
29f10 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
29f20 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
29f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
29f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29f50 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
29f60 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
29f70 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
29f80 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
29f90 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
29fa0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
29fb0 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
29fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
29fd0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
29fe0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
29ff0 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2a000 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2a010 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2a020 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2a030 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2a040 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2a050 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2a060 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2a070 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2a080 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a090 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2a0a0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2a0b0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2a0c0 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2a0d0 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2a0e0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2a0f0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2a100 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2a110 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2a120 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2a130 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2a140 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2a150 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2a160 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2a170 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2a180 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2a190 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2a1a0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2a1b0 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2a1c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a1d0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2a1e0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2a1f0 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2a200 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2a210 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2a220 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a230 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2a240 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2a250 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2a260 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2a270 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2a280 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2a290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a2a0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2a2b0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2a2c0 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
2a2d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2a2e0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2a2f0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2a300 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2a310 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2a320 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2a330 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2a340 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2a350 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2a360 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2a370 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2a380 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2a390 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2a3a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2a3b0 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2a3c0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2a3d0 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2a3e0 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2a3f0 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2a400 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2a410 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
2a420 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
2a430 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
2a440 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
2a450 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
2a460 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
2a470 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
2a480 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
2a490 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2a4a0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
2a4b0 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50  che */.  u32 szP
2a4c0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2a4d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2a4e0 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
2a4f0 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63  page size */.  c
2a500 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20  onst char *zUri 
2a510 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61  = 0;    /* URI a
2a520 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  rgs to copy */. 
2a530 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20   int nUri = 0;  
2a540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a550 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2a560 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72  URI args at *zUr
2a570 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  i */..  /* Figur
2a580 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
2a590 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
2a5a0 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2a5b0 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
2a5c0 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
2a5d0 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
2a5e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
2a5f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
2a600 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
2a610 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
2a620 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
2a630 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
2a640 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
2a650 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
2a660 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
2a670 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
2a680 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
2a690 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
2a6a0 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
2a6b0 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
2a6c0 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
2a6d0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
2a6e0 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
2a6f0 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
2a700 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
2a710 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2a720 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
2a730 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
2a740 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
2a750 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
2a760 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
2a770 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
2a780 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
2a790 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2a7a0 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
2a7b0 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
2a7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
2a7d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2a7e0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
2a7f0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
2a800 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
2a810 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2a820 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2a830 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2a840 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2a850 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2a860 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2a870 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2a880 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2a890 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2a8a0 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
2a8b0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   0;.  }.#endif..
2a8c0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2a8d0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2a8e0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2a8f0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2a900 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2a910 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2a920 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2a930 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2a940 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2a950 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2a960 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2a970 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2a980 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2a990 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2a9a0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2a9b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2a9c0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2a9d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2a9e0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2a9f0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2aa00 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
2aa10 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2aa20 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2aa30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2aa40 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68  .    }.    zPath
2aa50 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
2aa60 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
2aa70 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
2aa80 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
2aa90 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ls */.    rc = s
2aaa0 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
2aab0 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2aac0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
2aad0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2aae0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2aaf0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2ab00 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  thname);.    z =
2ab10 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61   zUri = &zFilena
2ab20 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
2ab30 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d  30(zFilename)+1]
2ab40 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
2ab50 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  ){.      z += sq
2ab60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2ab70 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73  +1;.      z += s
2ab80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ab90 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  )+1;.    }.    n
2aba0 55 72 69 20 3d 20 26 7a 5b 31 5d 20 2d 20 7a 55  Uri = &z[1] - zU
2abb0 72 69 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ri;.    if( rc==
2abc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2abd0 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2abe0 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2abf0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2ac00 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2ac10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2ac20 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2ac30 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2ac40 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2ac50 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2ac60 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2ac70 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2ac80 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2ac90 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2aca0 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2acb0 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2acc0 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2acd0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2ace0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2acf0 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2ad00 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2ad10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2ad20 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2ad30 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2ad40 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2ad50 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2ad60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ad70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2ad80 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
2ad90 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2ada0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2adb0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2adc0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2add0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2ade0 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2adf0 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2ae00 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2ae10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ae20 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2ae30 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2ae40 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2ae50 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2ae60 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2ae70 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2ae80 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2ae90 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2aea0 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2aeb0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2aec0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2aed0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2aee0 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2aef0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2af00 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2af10 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2af20 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2af30 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2af40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2af50 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2af60 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2af70 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2af80 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2af90 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2afa0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2afb0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2afc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2afd0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2afe0 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2aff0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2b000 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2b010 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2b020 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2b030 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2b040 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2b050 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2b060 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2b070 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2b080 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2b090 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2b0a0 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2b0b0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2b0c0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2b0d0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2b0e0 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2b0f0 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2b100 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2b110 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2b120 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2b130 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2b140 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2b150 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2b160 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2b170 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2b180 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20  ame + 8 + 1     
2b190 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2b1a0 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2b1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2b1c0 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2b1d0 2b 20 34 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 4 + 1         
2b1e0 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
2b1f0 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
2b200 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2b210 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
2b220 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
2b230 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
2b240 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
2b250 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b260 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
2b270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b280 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
2b290 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2b2a0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2b2b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2b2c0 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2b2d0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2b2e0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2b2f0 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2b300 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2b310 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2b320 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2b330 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2b340 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2b350 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2b360 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2b370 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2b380 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2b390 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2b3a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2b3b0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2b3c0 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2b3d0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2b3e0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2b3f0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2b400 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2b410 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2b420 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2b430 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2b440 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2b450 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2b460 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2b470 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2b480 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2b490 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2b4a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2b4b0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2b4c0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2b4d0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2b4e0 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2b4f0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2b500 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2b510 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2b520 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
2b530 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55  ame+1], zUri, nU
2b540 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2b550 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2b560 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2b570 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2b580 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
2b590 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
2b5a0 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29  , "-journal", 8)
2b5b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2b5c0 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2b5d0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2b5e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2b5f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b600 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2b610 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2b620 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2b630 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2b640 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2b650 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2b660 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2b670 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2b680 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2b690 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20   "-wal", 4);.   
2b6a0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2b6b0 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2b6c0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2b6d0 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Wal);.#endif.   
2b6e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
2b6f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2b700 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2b710 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2b720 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2b730 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2b740 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2b750 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2b760 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2b770 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2b780 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2b790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2b7a0 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2b7b0 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2b7c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b7d0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2b7e0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2b7f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2b800 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2b810 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2b820 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   );.    readOnly
2b830 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2b840 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2b850 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2b860 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2b870 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2b880 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2b890 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2b8a0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2b8b0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2b8c0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2b8d0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2b8e0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2b8f0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2b900 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2b910 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2b920 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2b930 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2b940 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2b950 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2b960 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2b970 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2b980 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2b990 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2b9a0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2b9b0 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2b9c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b9d0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
2b9e0 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
2b9f0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2ba00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ba10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2ba20 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2ba30 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2ba40 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
2ba50 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2ba60 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2ba70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2ba80 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2ba90 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2baa0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2bab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
2bac0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2bad0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2bae0 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2baf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bb00 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2bb10 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2bb20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
2bb30 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2bb40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2bb50 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2bb60 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
2bb70 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2bb80 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2bb90 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2bba0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
2bbb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bbc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2bbd0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2bbe0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2bbf0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2bc00 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2bc10 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2bc20 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2bc30 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2bc40 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2bc50 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2bc60 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2bc70 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2bc80 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2bc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2bca0 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2bcb0 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2bcc0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2bcd0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2bce0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
2bcf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2bd00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2bd10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2bd20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2bd30 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2bd40 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2bd50 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2bd60 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2bd70 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2bd80 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2bd90 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2bda0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2bdb0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2bdc0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2bdd0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2bde0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2bdf0 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2be00 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2be10 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2be20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2be30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2be40 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2be50 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2be60 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2be70 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2be80 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2be90 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2bea0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
2beb0 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
2bec0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2bed0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2bee0 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
2bef0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2bf00 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
2bf10 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2bf20 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2bf30 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2bf40 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2bf50 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2bf60 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2bf70 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2bf80 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2bf90 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2bfa0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2bfb0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2bfc0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2bfd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bfe0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2bff0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2c000 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2c010 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2c020 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2c030 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2c040 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2c050 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2c060 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2c070 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2c080 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2c090 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2c0a0 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2c0b0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2c0c0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2c0d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2c0e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c0f0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2c100 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2c110 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2c120 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2c130 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c140 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2c150 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2c160 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2c170 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2c180 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2c190 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2c1a0 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2c1b0 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2c1c0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2c1d0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2c1e0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2c1f0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2c200 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2c210 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2c220 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2c230 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2c240 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2c250 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2c260 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2c270 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2c280 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2c290 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2c2a0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2c2b0 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2c2c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2c2d0 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2c2e0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
2c2f0 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
2c300 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
2c310 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
2c320 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2c330 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c340 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2c350 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2c360 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2c370 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2c380 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2c390 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2c3a0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2c3b0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2c3c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2c3d0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2c3e0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2c3f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2c400 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2c410 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2c420 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2c430 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2c440 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2c450 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2c460 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2c470 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2c480 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2c490 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2c4a0 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2c4b0 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2c4c0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2c4d0 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2c4e0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2c4f0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2c500 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2c510 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2c520 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2c530 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2c540 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2c550 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2c560 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2c570 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2c580 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2c590 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2c5a0 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2c5b0 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2c5c0 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2c5d0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2c5e0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2c5f0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2c600 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2c610 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2c620 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
2c630 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
2c640 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
2c650 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2c660 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  s = pPager->noSy
2c670 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  nc ? 0 : SQLITE_
2c680 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70  SYNC_NORMAL;.  p
2c690 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2c6a0 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
2c6b0 79 6e 63 46 6c 61 67 73 3b 0a 20 20 2f 2a 20 70  yncFlags;.  /* p
2c6c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2c6d0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c6e0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2c6f0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c700 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2c710 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2c720 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2c730 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2c740 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2c750 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2c760 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2c770 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2c780 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2c790 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2c7a0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2c7b0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2c7c0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2c7d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c7e0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2c7f0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2c800 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2c810 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2c820 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2c830 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2c840 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2c850 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2c860 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2c870 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2c880 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2c890 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2c8a0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2c8b0 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2c8c0 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2c8d0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2c8e0 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70  ash)); */..  *pp
2c8f0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
2c900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c910 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  OK;.}..../*.** T
2c920 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c930 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
2c940 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
2c950 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
2c960 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
2c970 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
2c980 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
2c990 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
2c9a0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
2c9b0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2c9c0 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
2c9d0 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
2c9e0 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
2c9f0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2ca00 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
2ca10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2ca20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
2ca30 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
2ca40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2ca50 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
2ca60 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
2ca70 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2ca80 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
2ca90 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
2caa0 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
2cab0 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
2cac0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2cad0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cae0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2caf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2cb00 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
2cb10 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
2cb20 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
2cb30 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
2cb40 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2cb50 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2cb60 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
2cb70 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
2cb80 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
2cb90 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2cba0 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
2cbb0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
2cbc0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
2cbd0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
2cbe0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
2cbf0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
2cc00 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
2cc10 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
2cc20 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
2cc30 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
2cc40 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
2cc50 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
2cc60 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
2cc70 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2cc80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2cc90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
2cca0 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
2ccb0 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
2ccc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
2ccd0 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
2cce0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
2ccf0 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
2cd00 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
2cd10 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
2cd20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
2cd30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cd40 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2cd50 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
2cd60 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
2cd70 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
2cd80 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
2cd90 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
2cda0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
2cdb0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
2cdc0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
2cdd0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2cde0 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
2cdf0 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
2ce00 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
2ce10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2ce20 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
2ce30 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
2ce40 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
2ce50 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2ce60 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
2ce70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2ce80 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
2ce90 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
2cea0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2ceb0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2cec0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2ced0 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
2cee0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
2cef0 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
2cf00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2cf10 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
2cf20 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
2cf30 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2cf40 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
2cf50 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
2cf60 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
2cf70 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
2cf80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
2cf90 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
2cfa0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2cfb0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2cfc0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
2cfd0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2cfe0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2cff0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
2d000 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
2d010 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d020 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
2d030 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
2d040 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
2d050 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2d060 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
2d070 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2d080 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
2d090 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2d0a0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
2d0b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2d0c0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
2d0d0 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
2d0e0 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
2d0f0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2d100 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2d110 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
2d120 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
2d130 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
2d140 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
2d150 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
2d160 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
2d170 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2d180 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
2d190 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
2d1a0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
2d1b0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
2d1c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d1d0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
2d1e0 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
2d1f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2d200 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
2d210 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2d220 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
2d230 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
2d240 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
2d250 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
2d260 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
2d270 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
2d280 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2d290 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
2d2a0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
2d2b0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
2d2c0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
2d2d0 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
2d2e0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2d2f0 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
2d300 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
2d310 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
2d320 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
2d330 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2d340 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
2d350 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
2d360 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
2d370 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
2d380 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
2d390 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
2d3a0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
2d3b0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
2d3c0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
2d3d0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2d3e0 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
2d3f0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
2d400 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
2d410 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
2d420 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
2d430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d440 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2d450 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
2d460 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
2d470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d480 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
2d490 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2d4c0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
2d4d0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ile */..      /*
2d4e0 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
2d4f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d500 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
2d510 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
2d520 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
2d530 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2d540 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
2d550 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
2d560 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
2d570 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
2d580 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
2d590 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
2d5a0 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
2d5b0 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
2d5c0 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
2d5d0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
2d5e0 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69   and to avoid vi
2d5f0 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  olating.      **
2d600 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20   [H33020]..     
2d610 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2d620 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2d630 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
2d640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2d650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d660 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
2d670 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2d680 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
2d690 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2d6a0 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44    if( pagerLockD
2d6b0 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
2d6c0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
2d6d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d6e0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
2d6f0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
2d700 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
2d710 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2d720 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2d730 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c  eMode ) pagerUnl
2d740 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
2d750 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2d760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d770 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
2d780 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2d790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d7a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
2d7b0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2d7c0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
2d7d0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
2d7e0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
2d7f0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
2d800 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2d810 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
2d820 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
2d830 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
2d840 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
2d850 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
2d860 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
2d870 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
2d880 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2d890 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
2d8a0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
2d8b0 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
2d8c0 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
2d8d0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
2d8e0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
2d8f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2d900 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2d910 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2d920 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
2d930 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
2d940 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2d950 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
2d960 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2d970 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2d980 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
2d990 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
2d9a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d9b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d9c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d9d0 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
2d9e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2d9f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2da00 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
2da10 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
2da20 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
2da30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2da40 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
2da50 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
2da60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2da70 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
2da80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2da90 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2dab0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2dac0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2dad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dae0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
2daf0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
2db00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2db10 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
2db20 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
2db30 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
2db40 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
2db50 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
2db60 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
2db70 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
2db80 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
2db90 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
2dba0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
2dbb0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
2dbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2dbd0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
2dbe0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
2dbf0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
2dc00 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
2dc10 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
2dc20 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
2dc30 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
2dc40 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
2dc50 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
2dc60 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
2dc70 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
2dc80 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
2dc90 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
2dca0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
2dcb0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
2dcc0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
2dcd0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
2dce0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
2dcf0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
2dd00 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
2dd10 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
2dd20 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
2dd40 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
2dd50 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
2dd60 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
2dd70 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
2dd80 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
2dd90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2dda0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2ddb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ddc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ddd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dde0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ddf0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2de00 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
2de10 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
2de20 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
2de30 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
2de40 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2de50 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
2de60 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
2de70 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2de80 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
2de90 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
2dea0 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
2deb0 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
2dec0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2ded0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2dee0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
2def0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
2df00 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
2df10 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
2df20 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2df30 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
2df40 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
2df50 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
2df60 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
2df70 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
2df80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
2df90 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
2dfa0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
2dfb0 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
2dfc0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
2dfd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2dfe0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
2dff0 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
2e000 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
2e010 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
2e020 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
2e030 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2e040 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
2e050 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
2e060 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
2e070 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
2e080 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
2e090 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
2e0a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
2e0b0 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
2e0c0 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
2e0d0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
2e0e0 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
2e0f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e100 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
2e110 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
2e120 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
2e130 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
2e140 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
2e150 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
2e160 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2e170 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
2e180 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
2e190 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
2e1a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2e1b0 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
2e1c0 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
2e1d0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
2e1e0 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
2e1f0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
2e200 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
2e210 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
2e220 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
2e230 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2e240 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
2e250 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
2e260 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
2e270 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
2e280 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
2e290 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2e2a0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e2b0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2e2c0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
2e2d0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
2e2e0 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
2e2f0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
2e300 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
2e310 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
2e320 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2e330 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2e340 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2e350 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e360 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
2e370 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2e380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2e3b0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
2e3c0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2e3d0 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
2e3e0 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
2e3f0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
2e400 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
2e410 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
2e420 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
2e430 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
2e440 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
2e450 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
2e460 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
2e470 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
2e480 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
2e490 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
2e4a0 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ess mode..  */. 
2e4b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e4c0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2e4d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
2e4e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e4f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
2e500 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
2e510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e520 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2e530 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
2e540 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
2e550 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ER );.  if( NEVE
2e560 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
2e570 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
2e580 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2e590 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20  rCode; }..  if( 
2e5a0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2e5b0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
2e5c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2e5d0 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
2e5e0 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
2e5f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e600 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2e610 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
2e620 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
2e630 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
2e640 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e650 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c  >noReadlock==0 |
2e660 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  | pPager->readOn
2e670 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ly );..    if( p
2e680 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2e690 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
2e6a0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
2e6b0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
2e6c0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2e6d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e6e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
2e6f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2e700 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
2e710 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2e720 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
2e730 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2e740 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
2e750 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
2e760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2e770 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
2e780 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
2e790 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
2e7a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2e7b0 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
2e7c0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2e7d0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
2e7e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2e7f0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
2e800 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
2e810 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
2e820 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
2e830 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
2e840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2e850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e860 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2e870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e880 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
2e890 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
2e8a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
2e8b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e8c0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
2e8d0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
2e8e0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
2e8f0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2e900 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
2e910 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
2e920 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
2e930 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
2e940 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
2e950 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
2e960 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
2e970 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
2e980 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
2e990 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
2e9a0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
2e9b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2e9c0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
2e9d0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
2e9e0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
2e9f0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
2ea00 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
2ea10 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
2ea20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
2ea30 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2ea40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2ea50 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
2ea60 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
2ea70 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
2ea80 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
2ea90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2eaa0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
2eab0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
2eac0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
2ead0 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
2eae0 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
2eaf0 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
2eb00 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
2eb10 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
2eb20 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2eb30 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
2eb40 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
2eb50 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
2eb60 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20  he lock is.     
2eb70 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74   ** downgraded t
2eb80 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65  o SHARED_LOCK be
2eb90 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
2eba0 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20  on returns..    
2ebb0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2ebc0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
2ebd0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
2ebe0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2ebf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ec00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2ec10 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  led;.      }. . 
2ec20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73       /* If it is
2ec30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2ec40 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65  n and the file e
2ec50 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f  xists on disk, o
2ec60 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  pen the .      *
2ec70 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  * journal for re
2ec80 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
2ec90 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73   Write access is
2eca0 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
2ecb0 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65  e .      ** in e
2ecc0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
2ecd0 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
2ece0 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
2ecf0 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20   kept open .    
2ed00 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c    ** and possibl
2ed10 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
2ed20 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
2ed30 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61  n. Also, write-a
2ed40 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20  ccess .      ** 
2ed50 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69  is usually requi
2ed60 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  red to finalize 
2ed70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a  the journal in j
2ed80 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73  ournal_mode=pers
2ed90 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  ist .      ** mo
2eda0 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72  de (and also for
2edb0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72   journal_mode=tr
2edc0 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73  uncate on some s
2edd0 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a  ystems)..      *
2ede0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
2edf0 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
2ee00 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75  ot exist, it usu
2ee10 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  ally means that 
2ee20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  some .      ** o
2ee30 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2ee40 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
2ee50 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
2ee60 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
2ee70 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
2ee80 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
2ee90 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2eea0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
2eeb0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
2eec0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2eed0 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
2eee0 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
2eef0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
2ef00 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
2ef10 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
2ef20 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
2ef30 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2ef40 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2ef50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2ef60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
2ef70 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2ef80 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2ef90 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73         int bExis
2efa0 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
2efb0 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2efc0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2efd0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2efe0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2eff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
2f000 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f010 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
2f020 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69  SS_EXISTS, &bExi
2f030 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sts);.        if
2f040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f050 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20  && bExists ){.  
2f060 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
2f070 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f080 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
2f090 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2f0a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2f0b0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
2f0c0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2f0d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2f0e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2f0f0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2f100 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2f110 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
2f120 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
2f130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2f140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
2f150 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2f160 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
2f170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f180 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
2f190 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
2f1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2f1b0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2f1c0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
2f1d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
2f1e0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
2f1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f210 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
2f220 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
2f230 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
2f240 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
2f250 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
2f260 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
2f270 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
2f280 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
2f290 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
2f2a0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
2f2b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
2f2c0 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
2f2d0 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
2f2e0 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
2f2f0 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
2f300 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
2f310 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
2f320 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
2f330 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
2f340 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
2f350 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
2f360 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
2f370 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
2f380 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
2f390 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
2f3a0 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
2f3b0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2f3c0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
2f3d0 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
2f3e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
2f3f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f400 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2f410 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2f420 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  K );.        rc 
2f430 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
2f440 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2f450 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2f460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f470 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2f480 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
2f490 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
2f4a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2f4b0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
2f4c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2f4d0 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
2f4e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
2f4f0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e  .        pagerUn
2f500 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
2f510 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
2f520 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2f530 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f540 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2f550 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2f560 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2f570 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2f580 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   to open.       
2f590 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b   ** or roll back
2f5a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
2f5b0 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  hile holding an 
2f5c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
2f5d0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
2f5e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f  ager_unlock() ro
2f5f0 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
2f600 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  lled before retu
2f610 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a  rning to unlock.
2f620 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
2f630 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f  ile. If the unlo
2f640 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73  ck attempt fails
2f650 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f  , then Pager.eLo
2f660 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20  ck must be.     
2f670 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b     ** set to UNK
2f680 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74  NOWN_LOCK (see t
2f690 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
2f6a0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
2f6b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b   .        ** UNK
2f6c0 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20  NOWN_LOCK above 
2f6d0 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
2f6e0 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  on). .        **
2f6f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f  .        ** In o
2f700 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65  rder to get page
2f710 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f  r_unlock() to do
2f720 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72   this, set Pager
2f730 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20  .eState to.     
2f740 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f     ** PAGER_ERRO
2f750 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e  R now. This is n
2f760 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e  ot actually coun
2f770 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74  ted as a transit
2f780 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
2f790 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  o ERROR state in
2f7a0 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72   the state diagr
2f7b0 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  am at the top of
2f7c0 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20   this file,.    
2f7d0 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
2f7e0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61  know that the sa
2f7f0 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  me call to pager
2f800 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76  _unlock() will v
2f810 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ery.        ** s
2f820 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f  hortly transitio
2f830 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
2f840 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73  ct to the OPEN s
2f850 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20  tate. Calling.  
2f860 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f        ** assert_
2f870 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f  pager_state() wo
2f880 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73  uld fail now, as
2f890 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
2f8a0 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  e possible.     
2f8b0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45     ** to be in E
2f8c0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
2f8d0 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f  there are zero o
2f8e0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
2f8f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65  .        ** refe
2f900 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20  rences..        
2f910 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
2f920 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2f930 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
2f940 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
2f950 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2f960 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2f970 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
2f980 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
2f990 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52  ger->eLock==SHAR
2f9a0 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
2f9b0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
2f9c0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
2f9d0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53   pPager->eLock>S
2f9e0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
2f9f0 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
2fa00 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
2fa10 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28  pFile .     && (
2fa20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
2fa30 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
2fa40 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2fa50 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20  ->pPCache)>0) . 
2fa60 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2fa70 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
2fa80 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
2fa90 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
2faa0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
2fab0 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
2fac0 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
2fad0 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
2fae0 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
2faf0 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
2fb00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2fb10 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
2fb20 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2fb30 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
2fb40 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
2fb50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
2fb60 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
2fb70 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
2fb80 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
2fb90 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
2fba0 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
2fbb0 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
2fbc0 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
2fbd0 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
2fbe0 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
2fbf0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
2fc00 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
2fc10 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
2fc20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
2fc30 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
2fc40 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
2fc50 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
2fc60 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
2fc70 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
2fc80 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
2fc90 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
2fca0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
2fcb0 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
2fcc0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
2fcd0 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
2fce0 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
2fcf0 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
2fd00 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
2fd10 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
2fd20 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
2fd30 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
2fd40 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
2fd50 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
2fd60 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
2fd70 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
2fd80 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20       Pgno nPage 
2fd90 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
2fda0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
2fdb0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
2fdc0 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72  Vers)];..      r
2fdd0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2fde0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2fdf0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2fe00 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a   ) goto failed;.
2fe10 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
2fe20 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f  >0 ){.        IO
2fe30 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
2fe40 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2fe50 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2fe60 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rs)));.        r
2fe70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2fe80 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
2fe90 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
2fea0 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
2feb0 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
2fec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fed0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2fee0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
2fef0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2ff00 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
2ff10 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
2ff20 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
2ff30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ff40 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
2ff50 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
2ff60 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
2ff70 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
2ff80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
2ff90 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
2ffa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ffb0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2ffc0 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
2ffd0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
2ffe0 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
2fff0 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
30000 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
30010 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
30020 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
30030 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
30040 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
30050 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
30060 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ent(pPager);.#if
30070 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30080 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28  _WAL.    assert(
30090 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
300a0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
300b0 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  K );.#endif.  }.
300c0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
300d0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
300e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
300f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
30100 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
30110 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
30120 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
30130 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30140 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
30150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30160 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
30170 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
30180 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   &pPager->dbSize
30190 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
301a0 28 20 70 50 61 67 65 72 2d 3e 61 46 69 6c 65 43  ( pPager->aFileC
301b0 6f 6e 74 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 70  ontent==0 );.  p
301c0 50 61 67 65 72 2d 3e 6e 46 69 6c 65 43 6f 6e 74  Pager->nFileCont
301d0 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ent = pPager->db
301e0 53 69 7a 65 2a 28 73 71 6c 69 74 65 33 5f 69 6e  Size*(sqlite3_in
301f0 74 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  t64)pPager->page
30200 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 4f  Size;.  sqlite3O
30210 73 4d 61 70 28 70 50 61 67 65 72 2d 3e 66 64 2c  sMap(pPager->fd,
30220 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 46 69 6c   0, pPager->nFil
30230 65 43 6f 6e 74 65 6e 74 2c 0a 20 20 20 20 20 20  eContent,.      
30240 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
30250 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 28  OPEN_READONLY, (
30260 76 6f 69 64 2a 2a 29 26 70 50 61 67 65 72 2d 3e  void**)&pPager->
30270 70 4d 61 70 4f 62 6a 65 63 74 2c 0a 20 20 20 20  pMapObject,.    
30280 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
30290 2a 2a 29 26 70 50 61 67 65 72 2d 3e 61 46 69 6c  **)&pPager->aFil
302a0 65 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28  eContent);.  if(
302b0 20 70 50 61 67 65 72 2d 3e 61 46 69 6c 65 43 6f   pPager->aFileCo
302c0 6e 74 65 6e 74 3d 3d 30 20 29 20 70 50 61 67 65  ntent==0 ) pPage
302d0 72 2d 3e 6e 46 69 6c 65 43 6f 6e 74 65 6e 74 20  r->nFileContent 
302e0 3d 20 30 3b 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  = 0;.. failed:. 
302f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30300 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
30310 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
30320 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
30330 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
30340 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30350 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
30360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
30370 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
30380 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a  GER_READER;.  }.
30390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
303a0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
303b0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
303c0 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
303d0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
303e0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
303f0 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
30400 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
30410 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
30420 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
30430 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
30440 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
30450 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
30460 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
30470 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
30480 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
30490 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
304a0 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
304b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
304c0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
304d0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
304e0 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
304f0 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
30500 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
30510 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
30520 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
30530 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
30540 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
30550 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
30560 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
30570 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
30580 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
30590 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
305a0 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
305b0 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
305c0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
305d0 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
305e0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
305f0 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
30600 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
30610 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
30620 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
30630 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
30640 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
30650 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
30660 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
30670 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
30680 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
30690 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
306a0 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
306b0 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
306c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
306d0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
306e0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
306f0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
30700 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
30710 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
30720 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
30730 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
30740 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
30750 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
30760 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
30770 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
30780 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
30790 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
307a0 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
307b0 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
307c0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
307d0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
307e0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
307f0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
30800 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
30810 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
30820 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
30830 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
30840 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
30850 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
30860 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
30870 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
30880 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
30890 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
308a0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
308b0 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
308c0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
308d0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
308e0 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
308f0 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
30900 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
30910 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
30920 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
30930 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
30940 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
30950 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
30960 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
30970 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
30980 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
30990 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
309a0 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
309b0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
309c0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
309d0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
309e0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
309f0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
30a00 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
30a10 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
30a20 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
30a30 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
30a40 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
30a50 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
30a60 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
30a70 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
30a80 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
30a90 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
30aa0 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
30ab0 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
30ac0 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
30ad0 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
30ae0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
30af0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
30b00 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
30b10 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
30b20 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
30b30 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
30b40 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
30b50 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
30b60 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
30b70 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
30b80 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
30b90 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
30ba0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
30bb0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
30bc0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
30bd0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
30be0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
30bf0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
30c00 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
30c10 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
30c20 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
30c30 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
30c40 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
30c50 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
30c60 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
30c70 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
30c80 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
30c90 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
30ca0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
30cb0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
30cc0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
30cd0 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
30ce0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
30cf0 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
30d00 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
30d10 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
30d20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
30d30 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
30d40 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
30d50 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30d60 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
30d70 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
30d80 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
30d90 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
30da0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
30db0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
30dc0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
30dd0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
30de0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
30df0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
30e00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
30e10 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
30e20 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
30e30 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
30e40 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
30e50 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
30e60 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
30e70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
30e80 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
30e90 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
30ea0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
30eb0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
30ec0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
30ed0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
30ee0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
30ef0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
30f00 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
30f10 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
30f20 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
30f30 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
30f40 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
30f50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
30f60 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
30f70 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
30f80 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
30f90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30fa0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
30fb0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
30fc0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
30fd0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
30fe0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
30ff0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
31000 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
31010 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
31020 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
31030 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
31040 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
31050 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
31060 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
31070 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
31080 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31090 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
310a0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
310b0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
310c0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
310d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
310e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
310f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31100 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
31110 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
31120 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
31130 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
31140 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
31150 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
31160 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
31170 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
31180 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
31190 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
311a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
311b0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
311c0 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
311d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
311e0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
311f0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
31200 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
31210 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
31220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
31230 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
31240 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
31250 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
31260 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
31270 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
31280 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
31290 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
312a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
312b0 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
312c0 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
312d0 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
312e0 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
312f0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
31300 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
31310 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
31320 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
31330 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
31340 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
31350 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
31360 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
31370 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
31380 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
31390 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
313a0 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
313b0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
313c0 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
313d0 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
313e0 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
313f0 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
31400 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
31410 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
31420 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
31430 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
31440 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
31450 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
31460 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
31470 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a  pPager->nHit++;.
31480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31490 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
314a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
314b0 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
314c0 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
314d0 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
314e0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
314f0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
31500 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
31510 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
31520 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
31530 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
31540 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
31550 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
31560 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
31570 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
31580 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
31590 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
315a0 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
315b0 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
315c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
315d0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
315e0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
315f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
31600 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
31610 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31620 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
31630 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
31640 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31650 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
31660 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
31670 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
31680 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
31690 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
316a0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
316b0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
316c0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
316d0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
316e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
316f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31700 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
31710 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
31720 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
31730 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
31740 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
31750 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
31760 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
31770 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
31780 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
31790 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
317a0 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
317b0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
317c0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
317d0 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
317e0 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
317f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
31800 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
31810 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
31820 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
31830 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
31840 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
31850 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
31860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31870 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
31880 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
31890 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
318a0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
318b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
318c0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
318d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
318e0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
318f0 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
31900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31910 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
31920 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
31930 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
31940 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
31950 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
31960 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
31970 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
31980 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
31990 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
319a0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
319b0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
319c0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
319d0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
319e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
319f0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
31a00 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
31a10 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
31a20 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
31a30 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
31a40 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
31a50 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b  pPager->nMiss++;
31a60 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
31a70 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
31a80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31a90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31aa0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
31ab0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
31ac0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
31ad0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
31ae0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
31af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
31b00 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
31b10 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31b20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
31b30 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
31b40 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
31b50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
31b60 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
31b70 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
31b80 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
31b90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
31ba0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
31bb0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
31bc0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
31bd0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
31be0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
31bf0 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
31c00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31c10 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
31c20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
31c30 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
31c40 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
31c50 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
31c60 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
31c70 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
31c80 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
31c90 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
31ca0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
31cb0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
31cc0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
31cd0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
31ce0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31cf0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
31d00 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
31d10 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
31d20 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
31d30 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
31d40 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
31d50 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
31d60 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
31d70 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
31d80 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
31d90 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
31da0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
31db0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31dc0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
31dd0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
31de0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
31df0 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61  PCache!=0 );.  a
31e00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31e10 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
31e20 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
31e30 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
31e40 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  OR );.  sqlite3P
31e50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
31e60 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
31e70 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
31e80 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
31e90 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
31ea0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
31eb0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
31ec0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
31ed0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
31ee0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
31ef0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
31f00 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
31f10 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
31f20 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
31f30 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
31f40 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
31f50 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
31f60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31f70 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
31f80 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
31f90 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
31fa0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
31fb0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
31fc0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
31fd0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
31fe0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
31ff0 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
32000 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
32010 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
32020 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
32030 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
32040 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
32050 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
32060 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
32070 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
32080 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
32090 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
320a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
320b0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
320c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
320d0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
320e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
320f0 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
32100 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
32110 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
32120 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
32130 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
32140 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
32150 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
32160 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
32170 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
32180 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
32190 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
321a0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
321b0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
321c0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
321d0 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
321e0 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
321f0 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
32200 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
32210 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
32220 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
32230 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
32240 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
32250 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
32260 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
32270 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
32280 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
32290 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
322a0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
322b0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
322c0 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
322d0 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
322e0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
322f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
32300 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
32310 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
32320 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
32330 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
32340 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
32350 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
32360 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
32370 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
32380 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
32390 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
323a0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
323b0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
323c0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
323d0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
323e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
323f0 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
32400 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
32410 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
32420 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
32430 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
32440 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
32450 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32460 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
32470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32480 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
32490 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
324a0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
324b0 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
324c0 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
324d0 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
324e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
324f0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
32500 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
32510 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
32520 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
32530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
32540 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
32550 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
32560 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
32570 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
32580 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
32590 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
325a0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
325b0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
325c0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
325d0 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
325e0 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
325f0 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
32600 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
32610 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
32620 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
32630 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
32640 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32650 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
32660 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
32670 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
32680 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
32690 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
326a0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
326b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
326c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
326d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
326e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
326f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
32700 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
32710 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
32720 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
32730 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
32740 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
32750 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32760 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
32770 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
32780 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32790 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
327a0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
327b0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
327c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
327d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
327e0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32800 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
32810 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
32820 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
32830 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
32840 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
32850 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
32860 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
32870 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
32880 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
32890 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
328a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
328b0 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
328c0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
328d0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
328e0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
328f0 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
32900 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
32910 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  TE.        rc = 
32920 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
32930 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
32940 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32950 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32960 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
32970 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
32980 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  r).        );.  
32990 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63  #else.        rc
329a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
329b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
329c0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
329d0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
329e0 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20  .  #endif.      
329f0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
32a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
32a10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32a20 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
32a30 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
32a40 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
32a50 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
32a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
32a70 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
32a80 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
32a90 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
32aa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
32ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32ac0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
32ad0 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
32ae0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
32af0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
32b00 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
32b10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
32b20 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
32b30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
32b40 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
32b50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
32b60 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
32b70 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
32b80 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
32b90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
32ba0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
32bc0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
32bd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
32be0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
32bf0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
32c00 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
32c10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32c20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
32c30 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
32c40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
32c50 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
32c60 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
32c70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
32c80 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
32c90 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
32ca0 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
32cb0 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
32cc0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32cd0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
32ce0 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
32cf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
32d00 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
32d10 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
32d20 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
32d30 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
32d40 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
32d50 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32d60 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
32d70 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
32d80 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
32d90 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
32da0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
32db0 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
32dc0 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
32dd0 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
32de0 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
32df0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
32e00 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
32e10 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
32e20 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
32e30 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
32e40 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
32e50 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
32e60 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
32e70 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
32e80 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
32e90 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
32ea0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
32eb0 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
32ec0 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
32ed0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
32ee0 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
32ef0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32f00 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
32f10 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
32f20 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
32f30 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
32f40 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
32f50 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
32f60 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
32f70 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
32f80 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
32f90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
32fa0 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
32fb0 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
32fc0 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
32fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
32fe0 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
32ff0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
33000 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
33010 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
33020 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
33030 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
33040 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
33050 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
33060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33070 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
33080 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
33090 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52  >eState<PAGER_ER
330a0 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ROR );.  pPager-
330b0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
330c0 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
330d0 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
330e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
330f0 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b  PAGER_READER) ){
33100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33110 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
33120 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
33130 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33140 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
33150 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
33160 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
33170 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
33180 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
33190 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
331a0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
331b0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
331c0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
331d0 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
331e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
331f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
33200 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
33210 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
33220 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
33230 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
33240 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
33250 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
33260 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
33270 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
33290 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
332a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
332b0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
332c0 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
332d0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
332e0 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
332f0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
33300 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
33310 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
33320 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
33330 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
33340 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
33350 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
33360 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
33370 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
33380 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
33390 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
333a0 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
333b0 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
333c0 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
333d0 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
333e0 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
333f0 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
33400 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
33410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33420 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
33430 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
33440 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
33450 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
33460 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
33470 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
33480 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
33490 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
334a0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
334b0 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
334c0 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
334d0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
334e0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
334f0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
33500 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
33510 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
33520 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
33530 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
33540 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
33550 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
33560 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
33570 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33580 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
33590 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
335a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
335b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
335c0 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
335d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
335e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
335f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
33600 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
33610 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
33620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33630 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
33640 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
33650 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
33660 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
33670 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
33680 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
33690 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
336a0 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
336b0 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
336c0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
336d0 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
336e0 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
336f0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
33700 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
33710 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
33720 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
33730 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
33740 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
33750 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
33760 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
33770 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
33780 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
33790 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
337a0 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
337b0 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
337c0 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
337d0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
337e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
337f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
33800 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
33810 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
33820 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
33830 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33840 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33850 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
33860 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
33870 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
33880 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
33890 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
338a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
338b0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
338c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
338d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
338e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
338f0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
33900 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
33910 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
33920 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33930 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
33940 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
33950 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33960 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
33970 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
33980 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
33990 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
339a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
339b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
339c0 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
339d0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
339e0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
339f0 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
33a00 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
33a10 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
33a20 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
33a30 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
33a40 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
33a50 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
33a60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
33a70 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
33a80 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
33a90 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
33aa0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33ab0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
33ac0 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
33ad0 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
33ae0 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
33af0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
33b00 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
33b10 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
33b20 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
33b30 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
33b40 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
33b50 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
33b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
33b70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
33b80 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
33b90 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
33ba0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
33bb0 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
33bc0 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
33bd0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
33be0 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
33bf0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
33c00 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
33c10 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
33c20 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
33c30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33c40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
33c50 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
33c60 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33c70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33c80 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
33c90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33ca0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33cb0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
33cc0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
33cd0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
33ce0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
33cf0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
33d00 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
33d10 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
33d20 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
33d30 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68  * again. This sh
33d40 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c  ould not happen,
33d50 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70   but the check p
33d60 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65  rovides robustne
33d70 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ss. */.  if( NEV
33d80 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
33d90 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
33da0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
33db0 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
33dc0 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
33dd0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
33de0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
33df0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
33e00 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
33e10 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
33e20 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
33e30 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
33e40 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
33e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
33e60 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  ERM;..  CHECK_PA
33e70 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
33e80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33e90 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
33ea0 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
33eb0 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
33ec0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
33ed0 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
33ee0 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
33ef0 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
33f00 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
33f10 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
33f20 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
33f30 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
33f40 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
33f50 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
33f60 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
33f70 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
33f80 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
33f90 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
33fa0 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
33fb0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
33fc0 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
33fd0 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
33fe0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
33ff0 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
34000 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
34010 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
34020 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
34030 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
34040 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
34050 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
34060 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
34070 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
34080 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
34090 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
340a0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
340b0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
340c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
340d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
340e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
340f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34100 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
34110 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
34120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34130 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
34140 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
34150 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 61 67 65  * Make sure page
34160 20 63 6f 6e 74 65 6e 74 20 69 73 20 68 65 6c 64   content is held
34170 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d   in malloced mem
34180 6f 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ory */.  if( pPg
34190 2d 3e 70 44 61 74 61 21 3d 70 50 67 2d 3e 70 42  ->pData!=pPg->pB
341a0 75 66 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  uf ){.    memcpy
341b0 28 70 50 67 2d 3e 70 42 75 66 2c 20 70 50 67 2d  (pPg->pBuf, pPg-
341c0 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
341d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
341e0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
341f0 61 20 3d 20 70 50 67 2d 3e 70 42 75 66 3b 0a 20  a = pPg->pBuf;. 
34200 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
34210 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
34220 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
34230 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
34240 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
34250 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
34260 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
34270 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
34280 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
34290 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
342a0 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  if( pageInJourna
342b0 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52  l(pPg) && !subjR
342c0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
342d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
342e0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
342f0 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  ger) );.  }else{
34300 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
34310 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
34320 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
34330 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
34340 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
34350 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
34360 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
34370 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
34380 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
34390 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
343a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
343b0 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
343c0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
343d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
343e0 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28   !pageInJournal(
343f0 70 50 67 29 20 26 26 20 21 70 61 67 65 72 55 73  pPg) && !pagerUs
34400 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
34410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61        assert( pa
34420 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34430 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
34440 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
34450 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
34460 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
34470 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
34480 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
34490 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
344a0 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  2;.        i64 i
344b0 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
344c0 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20  urnalOff;..     
344d0 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
344e0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
344f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34500 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
34510 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
34520 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
34530 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
34540 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
34550 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  fies.        ** 
34560 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
34570 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
34580 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
34590 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
345a0 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  er) );..        
345b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
345c0 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67  journalHdr<=pPag
345d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
345e0 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
345f0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
34600 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
34610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
34620 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
34630 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
34640 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
34650 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20  (u8*)pData2);.. 
34660 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69         /* Even i
34670 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
34680 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ull error occurs
34690 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
346a0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
346b0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
346c0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
346d0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
346e0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
346f0 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
34700 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
34710 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
34720 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
34730 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
34740 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
34750 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
34760 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
34770 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
34780 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
34790 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
347a0 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
347b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
347c0 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
347d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
347e0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
347f0 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
34800 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66  /.        pPg->f
34810 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
34820 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20  ED_SYNC;..      
34830 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
34840 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
34850 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  iOff, pPg->pgno)
34860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
34880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
34890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
348a0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
348b0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
348c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66  ->pageSize, iOff
348d0 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +4);.        if(
348e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
348f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34900 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
34910 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
34920 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70  , iOff+pPager->p
34930 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d  ageSize+4, cksum
34940 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
34960 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
34970 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
34980 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
34990 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
349a0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
349b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
349c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
349d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
349e0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
349f0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
34a00 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
34a10 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
34a20 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
34a30 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
34a40 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
34a50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
34a60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
34a70 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
34a80 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
34a90 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
34aa0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
34ab0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
34ac0 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70  g)));..        p
34ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
34ae0 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d  f += 8 + pPager-
34af0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
34b00 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
34b10 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
34b20 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
34b30 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
34b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34b50 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
34b60 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
34b70 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
34b80 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
34b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
34ba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
34bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34bd0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  M );.        rc 
34be0 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  |= addToSavepoin
34bf0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
34c00 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
34c10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34c30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
34c40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
34c50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
34c60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
34c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34c80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
34c90 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
34ca0 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20  ITER_DBMOD ){.  
34cb0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
34cc0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
34cd0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d  _SYNC;.        }
34ce0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
34cf0 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
34d00 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
34d10 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
34d20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
34d30 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
34d40 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
34d50 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
34d60 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
34d70 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
34d80 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
34d90 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
34da0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
34db0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
34dc0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
34dd0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
34de0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
34df0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
34e00 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
34e10 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
34e20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
34e30 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
34e40 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
34e50 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
34e60 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
34e70 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
34e80 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
34e90 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
34ea0 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
34eb0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
34ec0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
34ed0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
34ee0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34ef0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
34f00 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
34f10 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
34f20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
34f30 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
34f40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
34f50 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a   pPg->pgno;.  }.
34f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34f70 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
34f80 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
34f90 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ble. This routin
34fa0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
34fb0 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69   before .** maki
34fc0 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ng changes to a 
34fd0 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72  page. The caller
34fe0 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
34ff0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a  return value .**
35000 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
35010 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  n and be careful
35020 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61   not to change a
35030 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c  ny page data unl
35040 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ess .** this rou
35050 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
35060 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
35070 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
35080 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
35090 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
350a0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
350b0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
350c0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
350d0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
350e0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
350f0 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
35100 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
35110 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
35120 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
35130 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
35140 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
35150 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
35160 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
35170 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
35180 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
35190 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  , SQLITE_NOMEM o
351a0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
351b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
351c0 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  * as appropriate
351d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
351e0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
351f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35200 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
35210 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35220 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
35230 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
35240 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
35250 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
35260 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
35270 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
35280 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
35290 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
352a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
352b0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
352c0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
352d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
352e0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
352f0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
35300 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35310 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35320 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
35330 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
35340 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
35350 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
35360 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
35370 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
35380 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
35390 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
353a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
353b0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
353c0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
353d0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
353e0 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20   nPage = 0;     
353f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
35400 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
35410 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
35420 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
35430 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
35440 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
35450 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
35460 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
35470 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
35480 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
35490 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
354a0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
354b0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
354c0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
354d0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
354e0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20  annot allow.    
354f0 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ** a journal hea
35500 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
35510 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
35520 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
35530 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
35540 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
35550 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
35560 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35570 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
35580 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  cSpill==0 );.   
35590 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
355a0 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20  ncSpill++;..    
355b0 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
355c0 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
355d0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
355e0 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
355f0 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
35600 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
35610 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
35620 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
35630 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
35640 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
35650 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
35660 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
35670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
35680 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
35690 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
356a0 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
356b0 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70    nPageCount = p
356c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
356d0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
356e0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
356f0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
35700 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
35710 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35720 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
35730 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
35740 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
35750 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
35760 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
35770 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
35780 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
35790 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
357a0 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
357b0 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
357c0 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
357d0 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
357e0 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
357f0 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
35800 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
35810 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
35820 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
35830 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
35840 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
35850 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
35860 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
35870 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
35880 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
35890 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
358a0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
358b0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
358c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
358d0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
358e0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
358f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
35900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35910 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
35920 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
35930 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
35940 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
35950 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
35960 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
35970 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
35980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35990 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
359a0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
359b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
359c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
359d0 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
359e0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
359f0 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
35a00 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
35a10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
35a20 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
35a30 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
35a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35a50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
35a60 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
35a70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
35a80 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
35a90 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
35aa0 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
35ab0 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
35ac0 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
35ad0 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
35ae0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
35af0 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
35b00 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
35b10 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
35b20 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
35b30 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
35b40 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
35b50 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
35b60 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
35b70 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
35b80 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
35b90 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
35ba0 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
35bb0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
35bc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
35bd0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
35be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35bf0 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b  K && needSync ){
35c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
35c10 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66  MEMDB );.      f
35c20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
35c30 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
35c40 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
35c50 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
35c60 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
35c70 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
35c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
35c90 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
35ca0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
35cb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35cc0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
35cd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35cf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35d00 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
35d10 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
35d20 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d  >doNotSyncSpill-
35d30 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
35d40 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
35d50 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
35d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35d70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
35d80 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
35d90 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
35da0 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
35db0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
35dc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35dd0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
35de0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
35df0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
35e00 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
35e10 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
35e20 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
35e30 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35e40 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
35e50 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c    return pPg->fl
35e60 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b  ags&PGHDR_DIRTY;
35e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
35e80 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
35e90 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
35ea0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
35eb0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
35ec0 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
35ed0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
35ee0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
35ef0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
35f00 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
35f10 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
35f20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
35f30 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
35f40 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
35f50 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
35f60 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
35f70 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
35f80 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
35f90 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
35fa0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
35fb0 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
35fc0 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
35fd0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
35fe0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
35ff0 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
36000 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
36010 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
36020 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
36030 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
36040 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
36050 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
36060 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
36070 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
36080 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
36090 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
360a0 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
360b0 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
360c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
360d0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
360e0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
360f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
36100 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
36110 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
36120 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
36130 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
36140 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
36150 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
36160 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
36170 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
36180 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
36190 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
361a0 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
361b0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
361c0 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
361d0 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
361e0 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f  RITE;.    pager_
361f0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
36200 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
36210 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
36220 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
36230 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
36240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36250 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
36260 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
36270 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
36280 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
36290 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
362a0 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
362b0 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20  he pager file.  
362c0 54 68 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68  The secondary ch
362d0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a  ange counter at.
362e0 2a 2a 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70  ** 92 is also up
362f0 64 61 74 65 64 2c 20 61 73 20 69 73 20 74 68 65  dated, as is the
36300 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
36310 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
36320 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74   96..**.** But t
36330 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
36340 20 69 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e   if the pPager->
36350 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
36360 66 6c 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a  flag is false..*
36370 2a 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73  * To avoid exces
36380 73 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61  s churning of pa
36390 67 65 20 31 2c 20 74 68 65 20 75 70 64 61 74 65  ge 1, the update
363a0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e   only happens on
363b0 63 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  ce..** See also 
363c0 74 68 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  the pager_write_
363d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
363e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
363f0 73 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69  s an .** uncondi
36400 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66  tional update of
36410 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
36420 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ters..**.** If t
36430 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
36440 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
36450 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
36460 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
36470 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36480 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
36490 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
364a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
364b0 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
364c0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
364d0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
364e0 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
364f0 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
36500 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
36510 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
36520 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
36530 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
36540 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
36550 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
36560 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
36570 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
36580 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
36590 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
365a0 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
365b0 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
365c0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
365d0 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
365e0 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
365f0 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
36600 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
36610 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
36620 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
36630 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
36640 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
36650 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
36660 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
36670 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
36680 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
36690 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
366a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
366b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
366c0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
366d0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
366e0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
366f0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36700 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
36710 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36720 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36730 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  );..  /* Declare
36740 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
36750 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
36760 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
36770 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
36780 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
36790 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
367a0 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
367b0 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
367c0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
367d0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
367e0 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
367f0 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
36800 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
36810 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
36820 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
36830 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
36840 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
36850 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
36860 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
36870 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
36880 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
36890 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
368a0 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
368b0 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
368c0 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
368d0 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
368e0 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
368f0 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
36900 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
36910 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
36920 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
36930 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
36940 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
36950 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
36960 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
36970 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
36980 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
36990 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
369a0 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
369b0 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
369c0 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  ode.#endif..  if
369d0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
369e0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
369f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
36a00 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
36a10 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
36a20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
36a30 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20   to page 1 */.. 
36a40 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
36a50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
36a60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
36a70 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
36a80 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
36a90 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
36aa0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
36ab0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
36ac0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
36ad0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
36ae0 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
36af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
36b00 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
36b10 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
36b20 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
36b30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
36b40 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
36b50 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
36b60 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
36b70 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
36b80 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
36b90 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
36ba0 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
36bb0 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
36bc0 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
36bd0 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
36be0 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
36bf0 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
36c00 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
36c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
36c20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
36c30 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
36c40 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
36c50 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
36c60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36c70 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
36c80 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
36c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36ca0 20 2f 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20   /* Actually do 
36cb0 74 68 65 20 75 70 64 61 74 65 20 6f 66 20 74 68  the update of th
36cc0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
36cd0 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
36ce0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
36cf0 74 65 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20  ter(pPgHdr);..  
36d00 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
36d10 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
36d20 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
36d30 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
36d40 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
36d50 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
36d60 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
36d70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
36d80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36d90 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
36da0 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
36db0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
36dc0 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
36dd0 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
36de0 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
36df0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36e10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36e20 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
36e30 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
36e40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
36e50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36e80 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
36e90 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
36ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
36ec0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
36ed0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
36ee0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
36ef0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
36f00 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
36f10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
36f20 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
36f30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36f40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
36f50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36f60 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
36f70 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
36f80 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
36f90 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
36fa0 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
36fb0 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
36fc0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
36fd0 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f  , or if called o
36fe0 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
36ff0 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
37000 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
37010 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
37020 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
37030 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
37040 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
37050 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37060 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
37070 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
37080 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37090 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
370a0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
370b0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
370c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
370d0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
370e0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
370f0 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  s);.  }else if( 
37100 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
37110 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
37120 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
37130 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
37140 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
37150 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59   SQLITE_FCNTL_SY
37160 4e 43 5f 4f 4d 49 54 54 45 44 2c 20 28 76 6f 69  NC_OMITTED, (voi
37170 64 20 2a 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20  d *)&rc);.  }.  
37180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37190 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
371a0 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
371b0 6c 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69  lled while a wri
371c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
371d0 73 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72  s active in.** r
371e0 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20  ollback. If the 
371f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
37200 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20   WAL mode, this 
37210 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
37220 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
37230 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
37240 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  n does not alrea
37250 64 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55  dy have an EXCLU
37260 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  SIVE lock on .**
37270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37280 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69  le, an attempt i
37290 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
372a0 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   one..**.** If t
372b0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
372c0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
372d0 64 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74  d or the attempt
372e0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73   to obtain it is
372f0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20  .** successful, 
37300 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  or the connectio
37310 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  n is in WAL mode
37320 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
37330 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65  eturned..** Othe
37340 72 77 69 73 65 2c 20 65 69 74 68 65 72 20 53 51  rwise, either SQ
37350 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20  LITE_BUSY or an 
37360 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
37370 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
37380 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
37390 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
373a0 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61  ExclusiveLock(Pa
373b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
373c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
373d0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
373e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
373f0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37400 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  MOD .       || p
37410 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37420 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37430 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  D .       || pPa
37440 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37450 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37460 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28   .  );.  assert(
37470 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37480 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
37490 20 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65   if( 0==pagerUse
374a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
374b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
374c0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
374d0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
374e0 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  K);.  }.  return
374f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
37500 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
37510 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
37520 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
37530 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
37540 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
37550 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
37560 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
37570 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
37580 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
37590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
375a0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
375b0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
375c0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
375d0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
375e0 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
375f0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
37600 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
37610 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
37620 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
37630 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
37640 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
37650 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
37660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
37670 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
37680 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
37690 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
376a0 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
376b0 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
376c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
376d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
376e0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
376f0 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
37700 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
37710 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
37720 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37730 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
37740 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
37750 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
37760 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
37770 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
37780 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
37790 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
377a0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
377b0 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
377c0 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
377d0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
377e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
377f0 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
37800 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
37810 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
37820 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
37830 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
37840 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
37850 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
37860 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
37870 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
37880 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
37890 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
378a0 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
378b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
378c0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
378d0 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
378e0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
378f0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
37900 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
37910 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
37920 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
37930 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
37940 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
37950 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
37960 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
37970 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
37980 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
37990 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
379a0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
379b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
379c0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
379d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
379e0 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
379f0 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
37a00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
37a10 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
37a20 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
37a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37a40 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
37a50 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
37a60 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
37a70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37a80 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
37a90 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
37aa0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
37ab0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37ac0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
37ad0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37ae0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37af0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
37b00 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37b10 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37b20 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20  WRITER_DBMOD.   
37b30 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37b40 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
37b50 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OR.  );.  assert
37b60 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
37b70 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
37b80 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72  .  /* If a prior
37b90 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
37ba0 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72   report that err
37bb0 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69  or again. */.  i
37bc0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
37bd0 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
37be0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
37bf0 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  de;..  PAGERTRAC
37c00 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E(("DATABASE SYN
37c10 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
37c20 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e  er=%s nSize=%d\n
37c30 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
37c40 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
37c50 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ster, pPager->db
37c60 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  Size));..  /* If
37c70 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61   no database cha
37c80 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d  nges have been m
37c90 61 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  ade, return earl
37ca0 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  y. */.  if( pPag
37cb0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
37cc0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37cd0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
37ce0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  _OK;..  if( MEMD
37cf0 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  B ){.    /* If t
37d00 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
37d10 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
37d20 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
37d30 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
37d40 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  s.    ** functio
37d50 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
37d60 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
37d70 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e   mostly a no-op.
37d80 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20    However, any. 
37d90 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20     ** backup in 
37da0 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74  progress needs t
37db0 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  o be restarted..
37dc0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
37dd0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
37de0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
37df0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
37e00 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
37e10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
37e20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
37e30 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
37e40 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
37e50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67  Cache);.      Pg
37e60 48 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20  Hdr *pPageOne = 
37e70 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  0;.      if( pLi
37e80 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
37e90 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74   /* Must have at
37ea0 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20   least one page 
37eb0 66 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d  for the WAL comm
37ec0 69 74 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20  it flag..       
37ed0 20 2a 2a 20 54 69 63 6b 65 74 20 5b 32 64 31 61   ** Ticket [2d1a
37ee0 35 63 36 37 64 66 63 32 33 36 33 65 34 34 66 32  5c67dfc2363e44f2
37ef0 39 64 39 62 62 64 35 37 66 5d 20 32 30 31 31 2d  9d9bbd57f] 2011-
37f00 30 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 20  05-18 */.       
37f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37f20 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
37f30 20 26 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20   &pPageOne);.   
37f40 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61       pList = pPa
37f50 67 65 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20 70  geOne;.        p
37f60 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 3d 20 30  List->pDirty = 0
37f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37f80 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37f90 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
37fa0 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
37fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
37fc0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
37fd0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
37fe0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
37ff0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
38000 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
38010 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   ? pPager->syncF
38020 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20  lags : 0).      
38030 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
38040 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
38050 6e 72 65 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a  nref(pPageOne);.
38060 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
38070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
38080 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
38090 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
380a0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
380b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
380c0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
380d0 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74  wing block updat
380e0 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
380f0 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68  unter. Exactly h
38100 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64  ow it.      ** d
38110 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73  oes this depends
38120 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
38130 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  ot the atomic-up
38140 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
38150 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65  n.      ** was e
38160 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
38170 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74  e time, and if t
38180 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
38190 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 20  meets the .     
381a0 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74   ** runtime crit
381b0 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20  eria to use the 
381c0 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20  operation: .    
381d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
381e0 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74   * The file-syst
381f0 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  em supports the 
38200 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
38210 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20  perty for.      
38220 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
38230 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
38240 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20  , and .      ** 
38250 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74     * This commit
38260 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
38270 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
38280 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
38290 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63      **    * Exac
382a0 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
382b0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
382c0 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
382d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
382e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
382f0 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
38300 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62  ion was not enab
38310 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
38320 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ime, then the.  
38330 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
38340 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
38350 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  ) function is ca
38360 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  lled to update t
38370 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20  he change.      
38380 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69  ** counter in 'i
38390 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49  ndirect-mode'. I
383a0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
383b0 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  on is compiled i
383c0 6e 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69  n but.      ** i
383d0 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65  s not applicable
383e0 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63   to this transac
383f0 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  tion, call sqlit
38400 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
38410 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  ).      ** to ma
38420 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
38430 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74  nal file has act
38440 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74  ually been creat
38450 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20  ed, then call.  
38460 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
38470 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
38480 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
38490 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
384a0 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20  n indirect.     
384b0 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20   ** mode. .     
384c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68   **.      ** Oth
384d0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f  erwise, if the o
384e0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62  ptimization is b
384f0 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20  oth enabled and 
38500 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20  applicable,.    
38510 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70    ** then call p
38520 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
38530 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
38540 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
38550 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ounter.      ** 
38560 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65  in 'direct' mode
38570 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
38580 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
38590 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20  will never be.  
385a0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66      ** created f
385b0 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
385c0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
385d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
385e0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
385f0 45 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  E.      PgHdr *p
38600 50 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Pg;.      assert
38610 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
38620 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
38630 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
38640 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
38650 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
38660 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
38670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
38680 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
38690 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
386a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   );.      if( !z
386b0 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
386c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
386d0 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
386e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
386f0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
38700 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70  er) .       && p
38710 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70  Pager->dbSize>=p
38720 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->db