/ Hex Artifact Content
Login

Artifact a656a65be35c03b20513017a2d45c90721ce1de549115d3c524f204603b6c58c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
8460: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8470: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8480: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8490: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
84a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
84b0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
84c0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
84d0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
84e0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
84f0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8510: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
8520: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
8530: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
8540: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
8550: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
8560: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8570: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8580: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8590: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
85a0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
85c0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
85d0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
85e0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
85f0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8600: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
8610: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
8620: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
8630: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
8640: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
8650: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
8660: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8670: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8690: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
86b0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
86c0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
86d0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
86e0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8700: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
8710: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
8720: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dif.};../*.** In
8730: 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69  dexes for use wi
8740: 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  th Pager.aStat[]
8750: 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61  . The Pager.aSta
8760: 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  t[] array contai
8770: 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  ns.** the values
8780: 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73   accessed by pas
8790: 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54  sing SQLITE_DBST
87a0: 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
87b0: 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f  CACHE_MISS .** o
87c0: 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f  r CACHE_WRITE to
87d0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
87e0: 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  us()..*/.#define
87f0: 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20   PAGER_STAT_HIT 
8800: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
8810: 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23  R_STAT_MISS  1.#
8820: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41  define PAGER_STA
8830: 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a  T_WRITE 2../*.**
8840: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8850: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8860: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8870: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8880: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
8890: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
88a0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
88b0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
88c0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
88d0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
88e0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
88f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8900: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8910: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8920: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8930: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8940: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8950: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8960: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8970: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8980: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
8990: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
89a0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
89b0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
89c0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
89d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
89e0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
89f0: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8a00: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8a10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8a20: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8a30: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8a40: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8a50: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8a60: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8a70: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8a80: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
8a90: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
8aa0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
8ab0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
8ac0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
8ad0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
8ae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8af0: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8b00: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8b10: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8b20: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8b30: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8b50: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8b60: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8b70: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8b80: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
8b90: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
8ba0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
8bb0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
8bc0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
8bd0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
8be0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8bf0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8c00: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8c10: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8c20: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8c30: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8c40: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8c50: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8c60: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8c70: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8c80: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
8c90: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8ca0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
8cb0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8cc0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
8cd0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
8ce0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8cf0: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8d00: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8d10: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8d20: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8d30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8d40: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8d50: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8d60: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8d70: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8d80: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
8d90: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
8da0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
8db0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
8dc0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
8dd0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
8de0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8df0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8e00: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8e10: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8e20: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8e30: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8e40: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8e50: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8e60: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8e70: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8e80: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
8e90: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
8ea0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
8eb0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
8ec0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
8ed0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
8ee0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8ef0: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8f00: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8f10: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8f20: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8f30: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8f40: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8f50: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8f60: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8f70: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8f80: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8f90: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8fa0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8fb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8fc0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8fd0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8fe0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8ff0: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
9000: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
9010: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
9020: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
9030: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
9040: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
9050: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
9060: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
9070: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
9080: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
9090: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
90a0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
90b0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
90c0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
90d0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
90e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
90f0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
9100: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
9110: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
9120: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
9130: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
9140: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
9150: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
9160: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
9170: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
9180: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
9190: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
91a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
91b0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
91c0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
91d0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
91e0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
91f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
9200: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
9210: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
9220: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
9230: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
9240: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
9250: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
9260: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
9270: 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69  macro USEFETCH i
9280: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
9290: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20   allowed to use 
92a0: 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78  the xFetch and x
92b0: 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72  Unfetch.** inter
92c0: 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20  faces to access 
92d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
92e0: 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  ng memory-mapped
92f0: 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   I/O..*/.#if SQL
9300: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
9310: 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45  E>0.# define USE
9320: 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62  FETCH(x) ((x)->b
9330: 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a  UseFetch).#else.
9340: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
9350: 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  H(x) 0.#endif../
9360: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
9370: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
9380: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
9390: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
93a0: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
93b0: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68  483647../*.** Th
93c0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
93d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
93e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
93f0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
9400: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
9410: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
9420: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
9430: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
9440: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
9450: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
9460: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
9470: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
9480: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
9490: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
94a0: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
94b0: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
94c0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
94d0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
94e0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
94f0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
9500: 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  ds!=0)../*.** Re
9510: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
9520: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
9530: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 74  rite-ahead log t
9540: 6f 20 72 65 61 64 20 70 61 67 65 20 70 67 6e 6f  o read page pgno
9550: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
9560: 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  e if the pager r
9570: 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65 63 74  eads pgno direct
9580: 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
9590: 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  base..*/.#if !de
95a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
95b0: 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69 6e 65  T_WAL) && define
95c0: 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  d(SQLITE_DIRECT_
95d0: 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29 0a 69  OVERFLOW_READ).i
95e0: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
95f0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
9600: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9610: 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d 20 30  .  u32 iRead = 0
9620: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
9630: 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
9640: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9650: 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
9660: 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
9670: 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 52  >pWal, pgno, &iR
9680: 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ead);.  return r
9690: 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a 23 65  c || iRead;.}.#e
96a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
96b0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20 64  ITE_OMIT_WAL.# d
96c0: 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61  efine pagerUseWa
96d0: 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61 6c 21  l(x) ((x)->pWal!
96e0: 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  =0).#else.# defi
96f0: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9700: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9710: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9720: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9730: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9740: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9750: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9760: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
9770: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
9780: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
9790: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
97a0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
97b0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
97c0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
97d0: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
97e0: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
97f0: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9800: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9810: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9820: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9830: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9840: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9850: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9860: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
9870: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
9880: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
9890: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
98a0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
98b0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
98c0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
98d0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
98e0: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
98f0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9900: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9910: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9920: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9930: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9940: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9950: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9960: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9970: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
9980: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
9990: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
99a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
99b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
99c0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
99d0: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
99e0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
99f0: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9a00: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9a10: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9a20: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9a30: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9a40: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9a50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9a60: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
9a70: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
9a80: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
9a90: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
9aa0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
9ab0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
9ac0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9ad0: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9ae0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9af0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9b00: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9b10: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9b20: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9b30: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9b40: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9b50: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9b60: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
9b70: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
9b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9b90: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
9ba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9bb0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
9bc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9bf0: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9c00: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9c10: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9c20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9c30: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9c40: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9c50: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9c60: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
9c70: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
9c80: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
9c90: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
9ca0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
9cb0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
9cc0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9cd0: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9ce0: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9cf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9d00: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9d10: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9d20: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9d30: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9d40: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9d50: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9d60: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
9d70: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
9d80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9d90: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
9da0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9db0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
9dc0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9dd0: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9de0: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9df0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9e00: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9e10: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9e20: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9e30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
9e40: 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20  Open(p->fd) );. 
9e50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9e60: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9e70: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9e80: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9e90: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9ea0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9eb0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9ec0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9ed0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9ee0: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9ef0: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9f00: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9f10: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9f20: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9f30: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9f40: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9f50: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9f60: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9f70: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9f80: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9f90: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9fa0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9fb0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9fc0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9fd0: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9fe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9ff0: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
a000: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
a010: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
a020: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
a030: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
a040: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
a050: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a060: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a070: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a080: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a090: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a0a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
a0b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
a0c0: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
a0d0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a0e0: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
a0f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a100: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a110: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a120: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a130: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a150: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
a160: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a170: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a180: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a190: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a1a0: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a1b0: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a1c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a1d0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a1e0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a1f0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a200: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a220: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a230: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
a240: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a250: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
a260: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
a270: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a280: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a290: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a2a0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a2b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a2c0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a2d0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a2e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2f0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a300: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a310: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a320: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a330: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a340: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a350: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a360: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a370: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a380: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a390: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a3a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a3b0: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a3c0: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a3d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a3e0: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a3f0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a400: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a410: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a420: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a430: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a440: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a450: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a460: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a470: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a490: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a4a0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4d0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a4e0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a4f0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a500: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a510: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a520: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a530: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a540: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a550: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a560: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a580: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a590: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a5a0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a5c0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a5d0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a5e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a5f0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a600: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a610: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a620: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a630: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a640: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a650: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a660: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a670: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a680: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a6a0: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a6b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a6c0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a6d0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a6e0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a6f0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a700: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a710: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a720: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a730: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a740: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a750: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a760: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a770: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a780: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a790: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a7a0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a7b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a7c0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a7d0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a7e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a7f0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a800: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a810: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a820: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a830: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a840: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a850: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a860: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a870: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a880: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a890: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a8a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a8b0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a8c0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a8d0: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a8e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a8f0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a900: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a910: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a920: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a930: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a940: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a950: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a960: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a970: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a980: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a990: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a9a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a9b0: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a9c0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a9d0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a9e0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a9f0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20  ->pPCache)>0 || 
aa00: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
aa10: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa20: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
aa30: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
aa40: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
aa50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
aa60: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
aa70: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
aa80: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
aa90: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
aaa0: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
aab0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
aac0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
aad0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
aae0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
aaf0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
ab00: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
ab10: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
ab20: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
ab30: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
ab40: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
ab50: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
ab60: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
ab70: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
ab80: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
ab90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
aba0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
abb0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
abc0: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
abd0: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
abe0: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
abf0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
ac00: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
ac10: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
ac20: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
ac30: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
ac40: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
ac50: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
ac60: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
ac70: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
ac80: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
ac90: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
aca0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
acb0: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
acc0: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
acd0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
ace0: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
acf0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
ad00: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
ad10: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
ad20: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
ad30: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
ad40: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
ad50: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
ad60: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
ad70: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
ad80: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
ad90: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
ada0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
adb0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
adc0: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
add0: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
ade0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
adf0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
ae00: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
ae10: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ae20: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ae30: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
ae40: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
ae50: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ae60: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
ae70: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
ae80: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
ae90: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
aea0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
aeb0: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
aec0: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
aed0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
aee0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
aef0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
af00: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
af10: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
af20: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
af30: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
af40: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
af50: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
af60: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
af70: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
af80: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
af90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
afa0: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
afb0: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
afc0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
afd0: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
afe0: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
aff0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
b000: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
b010: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
b020: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
b030: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
b040: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
b050: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
b060: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b070: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
b080: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
b090: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
b0a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b0b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
b0c0: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
b0d0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b0e0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b0f0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
b100: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
b110: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b120: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b130: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
b140: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
b150: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b160: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b170: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
b180: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
b190: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b1a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b1b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
b1c0: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
b1d0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b1e0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
b1f0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
b200: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
b210: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
b220: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
b230: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
b240: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
b250: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
b260: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
b270: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
b280: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
b290: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  .}.#endif../* Fo
b2a0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
b2b0: 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
b2c0: 70 61 67 65 20 67 65 74 74 65 72 73 20 2a 2f 0a  page getters */.
b2d0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
b2e0: 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72 2a 2c  geNormal(Pager*,
b2f0: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b300: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 67  t);.static int g
b310: 65 74 50 61 67 65 45 72 72 6f 72 28 50 61 67 65  etPageError(Page
b320: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b330: 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c 49 54  ,int);.#if SQLIT
b340: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
b350: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  0.static int get
b360: 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72 2a 2c  PageMMap(Pager*,
b370: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b380: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t);.#endif../*.*
b390: 2a 20 53 65 74 20 74 68 65 20 50 61 67 65 72 2e  * Set the Pager.
b3a0: 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f 72 20  xGet method for 
b3b0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
b3c0: 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
b3d0: 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65 6e 74  fetch.** content
b3e0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
b3f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b400: 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
b410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b420: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
b430: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70 50 61  rCode ){.    pPa
b440: 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50  ger->xGet = getP
b450: 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20 53 51  ageError;.#if SQ
b460: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b470: 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69 66 28  ZE>0.  }else if(
b480: 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
b490: 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ).#ifdef SQLITE_
b4a0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20  HAS_CODEC.   && 
b4b0: 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
b4c0: 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  0.#endif.  ){.  
b4d0: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b4e0: 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a 23 65   getPageMMap;.#e
b4f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
b500: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
b510: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  /.  }else{.    p
b520: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b530: 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20 20 7d  tPageNormal;.  }
b540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b550: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b560: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b570: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b580: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b590: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b5a0: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b5b0: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b5c0: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b5d0: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b5e0: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b5f0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b600: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b610: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b620: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b630: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b640: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b650: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b660: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b670: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b680: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b690: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b6a0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b6b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b6c0: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b6d0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b6e0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b6f0: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b700: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b710: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b720: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b740: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b750: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b760: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b770: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b780: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b790: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b7a0: 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e  cTestNotNull(p->
b7b0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b7c0: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b7d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b7e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b7f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b800: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
b810: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
b820: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
b830: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b850: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 61  pageInJournal(Pa
b860: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
b870: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b880: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b890: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
b8a0: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
b8b0: 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  no);.}.#endif../
b8c0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
b8d0: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
b8e0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b8f0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
b900: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
b910: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
b920: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
b930: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
b940: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
b950: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
b960: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
b970: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
b980: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
b990: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
b9a0: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
b9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b9c0: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
b9d0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b9e0: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
b9f0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
ba00: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
ba10: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
ba20: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
ba30: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
ba40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ba50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
ba60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
ba70: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
ba80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ba90: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
baa0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
bab0: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
bac0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
bad0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
bae0: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
baf0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
bb00: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
bb10: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bb20: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bb30: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
bb40: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
bb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
bb60: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
bb70: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
bb80: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
bb90: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
bba0: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
bbb0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
bbc0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
bbd0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
bbe0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
bbf0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
bc00: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
bc10: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
bc20: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
bc30: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bc40: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
bc50: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
bc60: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
bc70: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
bc80: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
bc90: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
bca0: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
bcb0: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
bcc0: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
bcd0: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
bce0: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
bcf0: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
bd00: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
bd10: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bd20: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bd30: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bd40: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
bd50: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
bd60: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
bd70: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
bd80: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
bd90: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
bda0: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
bdb0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
bdc0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
bdd0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
bde0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
bdf0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
be00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
be10: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
be20: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
be30: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
be40: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
be50: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
be60: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
be70: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
be80: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
be90: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
bea0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
beb0: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
bec0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
bed0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
bee0: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
bef0: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50  k );.    rc = pP
bf00: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bf10: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bf20: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
bf30: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
bf40: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
bf50: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bf60: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
bf70: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
bf80: 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eLock;.    }.   
bf90: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
bfa0: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
bfb0: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a  er, eLock)).  }.
bfc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bfd0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64  /*.** Lock the d
bfe0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
bff0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c000: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c010: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a  r SHARED_LOCK,.*
c020: 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  * RESERVED_LOCK 
c030: 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
c040: 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  K. If the caller
c050: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
c060: 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  set the.** Pager
c070: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
c080: 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  to the new locki
c090: 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  ng state. .**.**
c0a0: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
c0b0: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
c0c0: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
c0d0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c0e0: 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c  n is .** called,
c0f0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c100: 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77  t unless the new
c110: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69   locking state i
c120: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
c130: 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f  . .** See the co
c140: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
c150: 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f  #define of UNKNO
c160: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
c170: 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f  xplanation .** o
c180: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
c190: 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44  c int pagerLockD
c1a0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c1b0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c1c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c1d0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c  K;..  assert( eL
c1e0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c1f0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   || eLock==RESER
c200: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  VED_LOCK || eLoc
c210: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c220: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
c230: 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c  r->eLock<eLock |
c240: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
c250: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
c260: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
c270: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
c280: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
c290: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
c2a0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
c2b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c2c0: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
c2d0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
c2e0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c2f0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
c300: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
c310: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
c320: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
c330: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
c340: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
c350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c370: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
c380: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
c390: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
c3a0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
c3b0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
c3c0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
c3d0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
c3e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
c3f0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
c400: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c410: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
c420: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
c430: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
c440: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
c450: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
c460: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
c470: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
c480: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c490: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
c4a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
c4b0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
c4c0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
c4d0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
c4e0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
c4f0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
c500: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
c510: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
c520: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
c530: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
c540: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
c550: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
c560: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
c570: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
c580: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
c590: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
c5a0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
c5b0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
c5c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c5d0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
c5e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c5f0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
c600: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
c610: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
c620: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
c630: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c640: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
c650: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
c660: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
c670: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
c680: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
c690: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
c6a0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
c6b0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6d0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
c6e0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
c6f0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
c720: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
c730: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c740: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
c750: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
c760: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
c770: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
c780: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
c790: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c7a0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
c7b0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
c7c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c7d0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
c7e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c7f0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
c800: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c810: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
c820: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c830: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
c840: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
c850: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
c860: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c870: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
c880: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
c890: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
c8a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
c8b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
c8c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c8d0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
c8e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
c8f0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a 72 6e  lse.# define jrn
c900: 6c 42 75 66 66 65 72 53 69 7a 65 28 78 29 20 30  lBufferSize(x) 0
c910: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c920: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c930: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
c940: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
c950: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
c960: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
c970: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
c980: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
c990: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
c9a0: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
c9b0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
c9c0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c9d0: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
c9e0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
c9f0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
ca00: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
ca10: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
ca20: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
ca30: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
ca40: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
ca50: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
ca60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ca70: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
ca80: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
ca90: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
caa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
cab0: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
cac0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cad0: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
cae0: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
caf0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
cb00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
cb10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
cb20: 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a  )pPage->pData);.
cb30: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
cb40: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
cb50: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
cb60: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
cb70: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
cb80: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
cb90: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
cba0: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
cbb0: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
cbc0: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
cbd0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
cbe0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
cbf0: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
cc00: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
cc10: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
cc20: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
cc30: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
cc40: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
cc50: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
cc60: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
cc70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
cc80: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
cc90: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
cca0: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
ccb0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
ccc0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ccd0: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
cce0: 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
ccf0: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
cd00: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
cd10: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
cd20: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
cd30: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
cd40: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
cd50: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
cd60: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
cd70: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
cd80: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
cd90: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
cda0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29  _set_pagehash(X)
cdb0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
cdc0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
cdd0: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
cde0: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
cdf0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
ce00: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
ce10: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
ce20: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
ce30: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
ce40: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
ce50: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
ce60: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ce70: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
ce80: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
ce90: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
cea0: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
ceb0: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
cec0: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
ced0: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
cee0: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
cef0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
cf00: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
cf10: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
cf20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cf30: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
cf40: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
cf50: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
cf60: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
cf70: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
cf80: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
cf90: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
cfa0: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
cfb0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
cfc0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
cfd0: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
cfe0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
cff0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
d000: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
d010: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
d020: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d030: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
d040: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
d050: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
d060: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
d070: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
d080: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
d090: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
d0a0: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
d0b0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
d0c0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
d0d0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d0e0: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d100: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
d110: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
d120: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
d130: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
d140: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
d150: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
d160: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
d170: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
d180: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
d190: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
d1a0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
d1b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d1c0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
d1d0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
d1e0: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
d1f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d200: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
d210: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
d220: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
d230: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
d240: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d250: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
d260: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
d270: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
d280: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
d290: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
d2a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d2b0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
d2c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
d2d0: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
d2e0: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
d2f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d310: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
d320: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d340: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
d350: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
d360: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
d370: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
d380: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
d390: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
d3a0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
d3b0: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
d3c0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
d3d0: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
d3e0: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
d3f0: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
d400: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
d410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
d420: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
d430: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
d440: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
d450: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
d460: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
d470: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
d480: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
d490: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
d4a0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d4b0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
d4c0: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
d4d0: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
d4e0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
d4f0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
d500: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
d510: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
d520: 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20  r .   || len==0 
d530: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d540: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
d550: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
d560: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
d570: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d580: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d590: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
d5a0: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
d5b0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
d5c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
d5d0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d5e0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
d5f0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
d600: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
d610: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
d620: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d630: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
d640: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
d650: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d660: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
d670: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
d680: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
d690: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
d6a0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
d6b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
d6c0: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
d6d0: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
d6e0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
d6f0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
d700: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
d710: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d720: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
d730: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
d740: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
d750: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
d760: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
d770: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
d780: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
d790: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d7a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
d7b0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
d7c0: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
d7d0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
d7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d7f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d800: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
d810: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
d820: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
d830: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d840: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d850: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d860: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d870: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d880: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d890: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d8a0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d8b0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d8c0: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d8d0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d8e0: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d8f0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d920: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d940: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d960: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
d9b0: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
d9c0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
d9d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d9e0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
d9f0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
da00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
da10: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
da20: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
da30: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
da40: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
da50: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
da60: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
da70: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
da80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
da90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
daa0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
dab0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
dac0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dad0: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
dae0: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
daf0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
db00: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
db10: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
db20: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
db30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
db40: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
db50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
db60: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
db70: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
db80: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
db90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
dba0: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
dbb0: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
dbc0: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
dbd0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
dbe0: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
dbf0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
dc00: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
dc10: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
dc20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
dc30: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
dc40: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
dc50: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
dc60: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
dc70: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
dc80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
dc90: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
dca0: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
dcb0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
dcc0: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
dcd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dce0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
dcf0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
dd00: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
dd10: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
dd20: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
dd30: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
dd40: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
dd50: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
dd60: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
dd70: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
dd80: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
dd90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
dda0: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
ddb0: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
ddc0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
ddd0: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
dde0: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
ddf0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
de00: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
de10: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
de20: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
de30: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
de40: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
de50: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
de60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
de70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
de80: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
de90: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
dea0: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
deb0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
dec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
ded0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
dee0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
def0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
df00: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
df10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
df20: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
df50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
df60: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
df70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
df80: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
df90: 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
dfa0: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
dfb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
dfc0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
dfd0: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
dfe0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
dff0: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
e000: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
e010: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
e020: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
e030: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
e040: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
e050: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
e060: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e070: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e080: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
e090: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
e0a0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
e0b0: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
e0c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e0d0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e0e0: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
e0f0: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
e100: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
e110: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e120: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
e130: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
e140: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
e150: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
e160: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
e170: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  Y|pPager->syncFl
e180: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
e190: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e1a0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
e1b0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
e1c0: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
e1d0: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
e1e0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
e1f0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
e200: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
e210: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
e220: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
e230: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e240: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e250: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
e260: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
e270: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
e280: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
e290: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
e2a0: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
e2b0: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
e2c0: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
e2d0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
e2e0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
e2f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e300: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
e310: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
e320: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e330: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
e340: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
e350: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e360: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
e370: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
e380: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e390: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e3a0: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
e3b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e3c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e3d0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
e3e0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
e3f0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
e400: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
e410: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
e420: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
e430: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
e440: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
e460: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
e470: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
e480: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
e490: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e4a0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
e4b0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
e4c0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
e4d0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
e4e0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
e4f0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
e500: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
e510: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
e520: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
e530: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
e540: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
e550: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
e560: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
e570: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
e580: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
e590: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
e5a0: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
e5b0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
e5c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
e5d0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
e5e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
e5f0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
e600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e610: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
e620: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
e630: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
e640: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
e650: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
e660: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e680: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e690: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
e6a0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e6b0: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
e6c0: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
e6d0: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
e6e0: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
e6f0: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
e700: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
e710: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
e720: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
e730: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e760: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
e770: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
e780: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e7b0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e7c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e7d0: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
e7e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e7f0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
e800: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
e810: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e820: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
e830: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
e840: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
e850: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e860: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
e870: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
e880: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
e890: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
e8a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
e8b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
e8c0: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
e8d0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
e8e0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
e8f0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
e900: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
e910: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
e920: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
e930: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e940: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
e950: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
e960: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
e970: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
e980: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
e990: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
e9a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
e9b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
e9c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e9d0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
e9e0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
e9f0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
ea00: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
ea10: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
ea20: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
ea30: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
ea40: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
ea50: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
ea60: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
ea70: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
ea80: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
ea90: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
eaa0: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
eab0: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
eac0: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
ead0: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
eae0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
eaf0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
eb00: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
eb10: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
eb20: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
eb30: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
eb40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
eb50: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
eb60: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
eb70: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
eb80: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
eb90: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
eba0: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
ebb0: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
ebc0: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
ebd0: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
ebe0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ebf0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
ec00: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
ec10: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
ec20: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
ec30: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
ec40: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
ec50: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
ec60: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
ec70: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
ec80: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
ec90: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
eca0: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
ecb0: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
ecc0: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
ecd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
ece0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
ecf0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
ed00: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
ed10: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
ed20: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
ed30: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
ed40: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
ed50: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
ed60: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ed70: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
ed80: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
ed90: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
eda0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
edb0: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
edc0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
edd0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
ede0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
edf0: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
ee00: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
ee10: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
ee20: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
ee30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ee40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
ee50: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
ee60: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
ee70: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
ee80: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
ee90: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
eea0: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
eeb0: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
eec0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
eed0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
eee0: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
eef0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ef00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
ef10: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
ef20: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
ef30: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
ef40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ef50: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
ef60: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
ef70: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a  k-hash initializ
ef80: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
ef90: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
efa0: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
efb0: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
efc0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
efd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
efe0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
eff0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
f000: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f010: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
f020: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
f030: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f040: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f050: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
f060: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
f070: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
f080: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
f090: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
f0a0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
f0b0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f0c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f0d0: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
f0e0: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
f0f0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
f100: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
f110: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f120: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
f130: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
f140: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
f150: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
f160: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
f170: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
f180: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
f190: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
f1a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
f1b0: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
f1c0: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
f1d0: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
f1e0: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
f1f0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
f200: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
f210: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
f220: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
f230: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
f240: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
f250: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f260: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
f270: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
f280: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
f290: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
f2a0: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
f2b0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
f2c0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
f2d0: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
f2e0: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
f2f0: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
f300: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
f310: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
f320: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
f330: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
f340: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
f350: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
f360: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
f370: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
f380: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
f390: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
f3a0: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
f3b0: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
f3c0: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
f3d0: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
f3e0: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
f3f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
f400: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
f410: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
f420: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
f430: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
f440: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
f450: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
f460: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
f470: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f480: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
f490: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
f4a0: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
f4b0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f4c0: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
f4d0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
f4e0: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
f4f0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
f500: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
f510: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
f520: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
f530: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
f540: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
f550: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
f560: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
f570: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
f580: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
f590: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
f5a0: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
f5b0: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
f5c0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
f5d0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
f5e0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
f5f0: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
f600: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
f610: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
f620: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f630: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
f640: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
f650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
f660: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
f670: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
f680: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
f690: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
f6a0: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
f6b0: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
f6c0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
f6d0: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
f6e0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f6f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
f700: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
f710: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f720: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f730: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f740: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
f750: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
f760: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f770: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
f780: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
f7a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f7b0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
f7c0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
f7d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f7e0: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
f7f0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
f800: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
f810: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
f830: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
f840: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f850: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f860: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
f870: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f880: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
f890: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
f8a0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
f8b0: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
f8c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
f8d0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
f8e0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
f8f0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
f900: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
f910: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
f920: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
f930: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
f940: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
f950: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
f960: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
f970: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
f980: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
f990: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
f9a0: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
f9b0: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
f9c0: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
f9d0: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
f9e0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f9f0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
fa00: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
fa10: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
fa20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
fa30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
fa40: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
fa50: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
fa60: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
fa70: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
fa80: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
fa90: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
faa0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
fab0: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
fac0: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
fad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
fae0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
faf0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
fb00: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
fb10: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
fb20: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
fb30: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
fb40: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
fb50: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
fb60: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
fb70: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
fb80: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
fb90: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
fba0: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
fbd0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
fbe0: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
fbf0: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
fc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
fc10: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
fc20: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
fc30: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
fc40: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc60: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
fc70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
fc80: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
fc90: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
fca0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
fcb0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
fcc0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
fcd0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
fce0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fcf0: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
fd00: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
fd10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
fd20: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
fd30: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
fd40: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
fd50: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
fd60: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
fd70: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
fd80: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
fd90: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
fda0: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
fdb0: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
fdc0: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
fdd0: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
fde0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
fdf0: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
fe00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
fe10: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
fe20: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
fe30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fe40: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
fe50: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
fe60: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
fe70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
fe80: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
fe90: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
fea0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
feb0: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
fec0: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
fed0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
fee0: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
fef0: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
ff00: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
ff10: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
ff20: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
ff30: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
ff40: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
ff50: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
ff60: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
ff70: 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
ff80: 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
ff90: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
ffa0: 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
ffb0: 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
ffc0: 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
ffd0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ffe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
fff0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
10000 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
10010 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10030 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
10040 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
10050 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
10060 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
10070 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10080 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
10090 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
100a0 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
100b0 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
100c0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
100d0 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
100e0 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
100f0 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
10100 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
10110 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
10120 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
10130 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
10140 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10150 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
10160 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
10170 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10180 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10190 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
101a0 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
101b0 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
101c0 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
101d0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
101e0 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
101f0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
10200 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
10210 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10220 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10230 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
10240 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
10250 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
10270 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
10280 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
102a0 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
102b0 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
102c0 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
102d0 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
102e0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
102f0 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
10300 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
10310 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
10320 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10330 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
10340 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
10350 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
10360 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10370 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
10380 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10390 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
103a0 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
103b0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
103c0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
103d0 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
103e0 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
103f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10400 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
10410 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
10420 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
10430 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
10440 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
10450 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
10460 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
10470 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
10480 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
10490 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
104a0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
104b0 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
104c0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
104d0 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
104e0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
104f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
10500 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
10510 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
10520 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
10530 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
10540 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
10550 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
10560 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
10570 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
10580 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
10590 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
105a0 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
105b0 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
105c0 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
105d0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
105e0 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
105f0 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
10600 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
10610 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
10620 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
10630 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
10640 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
10650 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
10660 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
10670 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
10680 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10690 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
106a0 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
106b0 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
106c0 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
106d0 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
106e0 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
106f0 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
10700 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
10710 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
10720 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
10730 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
10740 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
10750 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
10760 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
10770 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
10780 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
10790 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
107a0 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
107b0 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
107c0 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
107d0 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
107e0 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
107f0 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
10800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
10810 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
10820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10830 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
10840 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
10850 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
10860 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
10870 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10880 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
10890 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
108a0 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
108b0 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
108c0 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
108d0 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
108e0 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
108f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
10900 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10910 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
10920 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
10930 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
10940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
10950 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10960 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
10970 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
10980 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
10990 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
109a0 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
109b0 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
109c0 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
109d0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
109e0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
109f0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
10a00 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
10a10 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
10a20 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
10a30 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
10a40 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
10a50 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
10a60 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
10a70 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
10a80 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
10a90 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
10aa0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
10ab0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
10ac0 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
10ad0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
10ae0 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
10af0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10b00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10b10 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
10b20 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
10b30 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10b40 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
10b50 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
10b60 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
10b70 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
10b80 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
10b90 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
10ba0 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
10bb0 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
10bc0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10bd0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10be0 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
10bf0 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
10c00 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10c10 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
10c20 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
10c30 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
10c40 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
10c50 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
10c60 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
10c70 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
10c80 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
10c90 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
10ca0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
10cb0 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
10cc0 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
10cd0 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
10ce0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
10cf0 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
10d00 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
10d10 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
10d20 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
10d30 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
10d40 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
10d50 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
10d60 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10d70 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
10d80 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
10d90 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
10da0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
10db0 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
10dc0 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
10dd0 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
10de0 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
10df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
10e00 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
10e10 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
10e20 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
10e30 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
10e40 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
10e50 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10e60 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
10e70 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
10e80 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10e90 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10ea0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10ed0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
10ee0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
10ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
10f00 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
10f10 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
10f20 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10f40 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
10f50 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
10f60 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
10f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
10fa0 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
10fb0 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
10fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
10fd0 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
10fe0 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
10ff0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11000 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
11010 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
11020 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
11030 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
11040 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
11050 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
11060 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11070 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73  EMORY .   || !is
11080 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11090 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
110a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
110b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
110c0 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
110d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
110e0 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
110f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
11100 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
11110 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
11120 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
11130 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
11140 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
11150 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
11160 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
11170 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
11180 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
11190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
111a0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
111b0 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
111c0 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
111d0 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
111e0 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
111f0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
11200 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
11210 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
11220 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
11230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
11240 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
11250 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
11260 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11270 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11280 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
11290 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
112a0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
112b0 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
112c0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
112d0 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
112e0 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
112f0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
11300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11310 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
11320 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
11330 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
11340 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
11350 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
11360 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11370 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11380 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
11390 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
113a0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
113b0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
113c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
113d0 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
113e0 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
113f0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11400 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11410 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11420 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
11430 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
11440 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11450 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11460 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11470 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
11480 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11490 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
114a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
114b0 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20  rnalMagic, 8,.  
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
114e0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
114f0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
11500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
11510 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11520 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
11530 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
11540 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
11550 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
11560 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
11570 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
11580 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
11590 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
115a0 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
115b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
115c0 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
115d0 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
115e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
115f0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
11600 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
11610 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
11620 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
11630 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
11640 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
11650 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
11660 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
11670 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
11680 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
11690 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
116a0 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
116b0 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
116c0 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
116d0 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
116e0 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
116f0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
11700 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
11710 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
11720 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
11730 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
11740 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
11750 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
11760 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
11770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
11780 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
11790 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
117a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
117b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
117c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
117d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
117e0 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
117f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
11800 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
11810 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
11820 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
11830 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11840 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56    pPager->iDataV
11850 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69  ersion++;.  sqli
11860 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
11870 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
11880 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
11890 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
118a0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
118b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50  ** Return the pP
118c0 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
118d0 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20  on value.*/.u32 
118e0 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61  sqlite3PagerData
118f0 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70  Version(Pager *p
11900 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
11910 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
11920 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  >PAGER_OPEN );. 
11930 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
11940 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a  iDataVersion;.}.
11950 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11960 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11970 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11980 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11990 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
119a0 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
119b0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
119c0 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
119d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
119e0 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
119f0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
11a00 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11a10 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11a20 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11a30 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11a40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11a50 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11a60 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11a70 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11a80 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11a90 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11aa0 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11ab0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11ac0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11ad0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11ae0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
11af0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
11b00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11b10 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11b20 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75  de || sqlite3Jou
11b30 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
11b40 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11b50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11b60 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11b70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11b80 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11b90 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11ba0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11bb0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11bc0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11bd0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11be0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11bf0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11c00 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
11c10 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
11c20 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
11c30 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
11c40 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11c60 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11c70 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11c80 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11c90 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11ca0 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11cb0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11cc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11cd0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11ce0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11cf0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11d00 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11d10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11d20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11d30 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
11d40 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11d50 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11d60 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11d70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11d80 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11d90 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11da0 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11db0 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11dc0 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11dd0 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11de0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11e00 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11e10 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11e20 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11e30 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11e50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11e60 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11e70 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11e80 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11e90 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11ea0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11eb0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11ec0 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11ed0 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11ee0 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
11ef0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11f00 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11f10 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
11f20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11f30 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
11f40 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11f50 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11f60 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11f70 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11f80 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11f90 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11fa0 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11fb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11fc0 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11fd0 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11fe0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11ff0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
12000 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
12010 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12020 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
12030 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12040 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
12050 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
12060 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
12070 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
12080 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
12090 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
120a0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
120b0 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
120c0 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
120d0 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
120e0 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
120f0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
12100 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
12110 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
12120 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
12130 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
12140 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
12150 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
12160 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
12170 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
12180 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
12190 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
121a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
121b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
121c0 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
121d0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
121e0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
121f0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
12200 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
12210 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
12220 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
12230 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
12240 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
12250 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
12260 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
12270 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
12280 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
12290 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
122a0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
122b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
122c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
122d0 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
122e0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
122f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
12300 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12310 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
12320 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
12330 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
12340 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
12360 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
12370 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
12380 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
12390 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
123a0 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
123b0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
123c0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
123d0 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
123e0 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
123f0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
12400 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
12410 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
12420 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
12430 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
12440 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
12450 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
12460 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
12470 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
12480 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
12490 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
124a0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
124b0 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
124c0 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
124d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
124e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
124f0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
12500 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12510 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12520 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
12530 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12540 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12550 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
12560 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12570 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12580 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
12590 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
125a0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
125b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
125c0 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
125d0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
125e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
125f0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12600 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
12610 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
12620 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
12630 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
12640 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
12650 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
12660 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
12670 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
12680 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
12690 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
126a0 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
126b0 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
126c0 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
126d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
126e0 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
126f0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12700 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
12710 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
12720 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
12730 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
12740 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
12750 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
12760 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
12770 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
12780 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
12790 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
127a0 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
127b0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
127c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
127d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
127e0 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
127f0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12800 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
12810 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
12820 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
12830 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
12840 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
12850 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
12860 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
12870 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
12880 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
12890 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
128a0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
128b0 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
128c0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
128d0 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
128e0 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
128f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12900 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
12910 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
12920 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
12930 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
12940 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12950 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12960 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12970 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12980 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12990 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
129a0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
129b0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
129c0 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
129d0 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
129e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
129f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12a00 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
12a10 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
12a20 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
12a30 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
12a40 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12a50 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12a60 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12a70 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
12a80 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12a90 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
12aa0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
12ab0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12ac0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
12ad0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
12ae0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
12af0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
12b00 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12b10 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12b20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12b30 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12b40 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
12b50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
12b60 61 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50  ate = (isOpen(pP
12b70 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47  ager->jfd) ? PAG
12b80 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f  ER_OPEN : PAGER_
12b90 52 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20  READER);.    }. 
12ba0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
12bb0 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
12bc0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
12bd0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
12be0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12bf0 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
12c00 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68     setGetterMeth
12c10 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  od(pPager);.  }.
12c20 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12c30 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
12c40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
12c50 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
12c60 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a  etMaster = 0;.}.
12c70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12c80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
12c90 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52  henever an IOERR
12ca0 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74   or FULL error t
12cb0 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20  hat requires.** 
12cc0 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61  the pager to tra
12cd0 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  nsition into the
12ce0 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79   ERROR state may
12cf0 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a   ahve occurred..
12d00 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
12d10 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
12d20 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
12d30 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73  structure, the s
12d40 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72  econd .** the er
12d50 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
12d60 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
12d70 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
12d80 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76  ction. The .** v
12d90 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
12da0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
12db0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
12dc0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
12dd0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
12de0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12df0 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53  s SQLITE_FULL, S
12e00 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f  QLITE_IOERR or o
12e10 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45  ne of the.** IOE
12e20 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68  RR sub-codes, th
12e30 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74  e pager enters t
12e40 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
12e50 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
12e60 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69  e.** is stored i
12e70 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12e80 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
12e90 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
12ea0 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20  ERROR state,.** 
12eb0 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61  all major API ca
12ec0 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72  lls on the Pager
12ed0 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
12ee0 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65  y return Pager.e
12ef0 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  rrCode..**.** Th
12f00 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  e ERROR state in
12f10 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
12f20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12f30 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
12f40 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
12f50 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
12f60 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
12f70 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
12f80 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
12f90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12fa0 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
12fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
12fc0 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
12fd0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
12fe0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74  rror occurred, t
12ff0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
13000 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
13010 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
13020 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  yed to restore t
13030 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
13040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13050 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65   (as if.** it we
13060 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  re a hot-journal
13070 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
13080 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
13090 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
130a0 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
130b0 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
130c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
130d0 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
130e0 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
130f0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
13100 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
13110 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
13120 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
13130 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
13140 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
13150 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
13160 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20  OERR.  );.  if( 
13170 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
13180 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   || rc2==SQLITE_
13190 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61  IOERR ){.    pPa
131a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
131b0 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  c;.    pPager->e
131c0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52  State = PAGER_ER
131d0 52 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74  ROR;.    setGett
131e0 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
131f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13200 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
13210 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
13220 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
13230 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a  gno nPage);../*.
13240 2a 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61  ** The write tra
13250 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e  nsaction open on
13260 20 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67   pPager is being
13270 20 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d   committed (bCom
13280 6d 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f  mit==1).** or ro
13290 6c 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d  lled back (bComm
132a0 69 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  it==0)..**.** Re
132b0 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64  turn TRUE if and
132c0 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72   only if all dir
132d0 74 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20  ty pages should 
132e0 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  be flushed to di
132f0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a  sk..**.** Rules:
13300 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20  .**.**   *  For 
13310 6e 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73  non-TEMP databas
13320 65 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20  es, always sync 
13330 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69  to disk.  This i
13340 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20  s necessary.**  
13350 20 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74      for transact
13360 69 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62  ions to be durab
13370 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53  le..**.**   *  S
13380 79 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73  ync TEMP databas
13390 65 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d  e only on a COMM
133a0 49 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41  IT (not a ROLLBA
133b0 43 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63  CK) when the bac
133c0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c  king.**      fil
133d0 65 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  e has been creat
133e0 65 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20  ed already (via 
133f0 61 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72  a spill on pager
13400 53 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a  Stress()) and.**
13410 20 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e        when the n
13420 75 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70  umber of dirty p
13430 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65  ages in memory e
13440 78 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68  xceeds 25% of th
13450 65 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20  e total.**      
13460 63 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73  cache size..*/.s
13470 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46  tatic int pagerF
13480 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67  lushOnCommit(Pag
13490 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
134a0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20  bCommit){.  if( 
134b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
134c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
134d0 20 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29    if( !bCommit )
134e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
134f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
13500 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b  >fd) ) return 0;
13510 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
13520 65 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44  e3PCachePercentD
13530 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
13540 61 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f  ache)>=25);.}../
13550 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13560 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
13570 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
13580 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
13590 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
135a0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
135b0 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
135c0 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
135d0 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
135e0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
135f0 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
13600 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
13610 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
13620 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
13630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13640 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
13650 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13660 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13670 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13680 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
13690 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
136a0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
136b0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
136c0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
136d0 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
136e0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
136f0 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
13700 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
13710 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
13720 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13730 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
13740 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
13750 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13760 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13770 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13780 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13790 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
137a0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
137b0 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
137c0 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
137d0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
137e0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
137f0 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
13800 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
13810 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
13820 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
13830 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
13840 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
13850 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13860 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13870 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13880 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
13890 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
138a0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
138b0 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
138c0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
138d0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
138e0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
138f0 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13900 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13910 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13920 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13930 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13940 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13950 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13960 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13970 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13980 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
13990 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
139a0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
139b0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
139c0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
139d0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
139e0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
139f0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13a00 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13a10 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13a20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13a30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13a40 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13a50 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13a60 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13a70 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13a80 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
13a90 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
13aa0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13ab0 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13ac0 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13ad0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
13ae0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13af0 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13b00 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13b10 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13b20 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13b30 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13b40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13b50 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13b60 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13b70 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13b80 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
13b90 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
13ba0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13bb0 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13bc0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13bd0 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
13be0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13bf0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13c00 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13c10 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13c20 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13c30 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13c40 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13c50 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13c60 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13c70 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13c80 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
13c90 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
13ca0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13cb0 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13cc0 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13cd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13ce0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13cf0 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13d00 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13d10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13d20 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13d30 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13d40 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13d50 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13d60 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13d70 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13d80 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
13d90 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
13da0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13db0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13dc0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13dd0 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
13de0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13df0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13e00 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13e10 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13e20 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13e30 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13e40 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13e50 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13e60 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13e70 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13e80 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
13e90 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
13ea0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13eb0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13ec0 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13ed0 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
13ee0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13ef0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13f00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13f10 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13f20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13f30 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13f40 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13f50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13f60 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13f70 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13f80 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
13f90 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
13fa0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13fb0 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13fc0 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13fd0 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13fe0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13ff0 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
14000 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
14010 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
14020 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
14030 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
14040 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
14050 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
14060 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
14070 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
14080 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
14090 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
140a0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
140b0 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
140c0 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
140d0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
140e0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
140f0 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
14100 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
14110 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
14120 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
14130 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
14140 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
14150 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
14160 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
14170 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
14180 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
14190 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
141a0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
141b0 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
141c0 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
141d0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
141e0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
141f0 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
14200 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
14210 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
14220 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
14230 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
14240 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
14250 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
14260 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
14270 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
14280 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
14290 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
142a0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
142b0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
142c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
142d0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
142e0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
142f0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
14300 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
14310 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
14320 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
14330 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14340 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
14350 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
14360 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
14370 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
14380 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
14390 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
143a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
143b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
143c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
143d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
143e0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
143f0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
14400 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
14410 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
14420 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
14430 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
14440 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
14450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14460 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14470 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20  LMODE_MEMORY ); 
14480 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14490 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
144a0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
144b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
144c0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
144d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
144e0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
144f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14500 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
14510 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14530 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14540 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
14550 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
14560 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
14580 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
14590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
145a0 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66  e sure the new f
145b0 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74  ile size is writ
145c0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f  ten into the ino
145d0 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  de right away.. 
145e0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65           ** Othe
145f0 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  rwise the journa
14600 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63  l might resurrec
14610 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  t following a po
14620 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20  wer loss and.   
14630 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
14640 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63  the last transac
14650 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63  tion to roll bac
14660 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20  k.  See.        
14670 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67    ** https://bug
14680 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  zilla.mozilla.or
14690 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  g/show_bug.cgi?i
146a0 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20  d=1072773.      
146b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
146c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
146d0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
146e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
146f0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gs);.        }. 
14700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
14710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14720 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
14730 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14740 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14750 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14760 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
14770 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14780 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
14790 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
147a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
147b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
147c0 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
147d0 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
147e0 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ter||pPager->tem
147f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50  pFile);.      pP
14800 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14810 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
14820 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
14830 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
14840 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
14850 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
14860 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
14870 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
14880 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
14890 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
148a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
148b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
148c0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
148d0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
148e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
148f0 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
14900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14910 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
14920 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
14930 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ory journal..   
14940 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
14950 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65  bDelete = !pPage
14960 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20  r->tempFile;.   
14970 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14980 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
14990 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ory(pPager->jfd)
149a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
149b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
149c0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
149d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
149e0 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
149f0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14a00 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14a10 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
14a20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
14a30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14a40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14a50 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
14a60 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14a70 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
14a80 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
14a90 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20   bDelete ){.    
14aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ab0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
14ac0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
14ad0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
14ae0 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20  >extraSync);.   
14af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14b00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
14b10 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69  ECK_PAGES.  sqli
14b20 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
14b30 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
14b40 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74  Cache, pager_set
14b50 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66  _pagehash);.  if
14b60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
14b70 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63  ==0 && sqlite3Pc
14b80 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
14b90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
14ba0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
14bb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
14bc0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
14bd0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
14be0 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20      p->pageHash 
14bf0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
14c00 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
14c10 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ull(p);.    }.  
14c20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
14c30 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
14c40 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
14c50 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
14c60 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
14c70 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
14c80 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
14c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14ca0 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65  f( MEMDB || page
14cb0 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70  rFlushOnCommit(p
14cc0 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20  Pager, bCommit) 
14cd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14ce0 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
14cf0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
14d00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14d10 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
14d20 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70 50 61  learWritable(pPa
14d30 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
14d40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14d50 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
14d60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14d70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
14d80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
14d90 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
14da0 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ){.    /* Drop t
14db0 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63  he WAL write-loc
14dc0 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c  k, if any. Also,
14dd0 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
14de0 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a  on was in .    *
14df0 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  * locking_mode=e
14e00 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75  xclusive mode bu
14e10 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20  t is no longer, 
14e20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49  drop the EXCLUSI
14e30 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  VE .    ** lock 
14e40 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
14e50 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
14e60 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  /.    rc2 = sqli
14e70 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72  te3WalEndWriteTr
14e80 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14e90 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73  ->pWal);.    ass
14ea0 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45  ert( rc2==SQLITE
14eb0 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _OK );.  }else i
14ec0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14ed0 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70   && bCommit && p
14ee0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
14ef0 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e>pPager->dbSize
14f00 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
14f10 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
14f20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
14f30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
14f40 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
14f50 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66  l.    ** mode if
14f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f70 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61  le on disk is la
14f80 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61  rger than the da
14f90 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
14fa0 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69    ** At this poi
14fb0 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  nt the journal h
14fc0 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
14fd0 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  d and the transa
14fe0 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75  ction .    ** su
14ff0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69  ccessfully commi
15000 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58  tted, but the EX
15010 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
15020 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
15030 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53  e.    ** file. S
15040 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
15050 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
15060 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74  abase file to it
15070 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  s minimum.    **
15080 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20   required size. 
15090 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
150a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
150b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
150c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
150d0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
150e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
150f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
15100 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
15110 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28  ommit && isOpen(
15120 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
15130 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15140 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
15150 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
15160 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41  FCNTL_COMMIT_PHA
15170 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69  SETWO, 0);.    i
15180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15190 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
151a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
151b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
151c0 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
151d0 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28  & (!pagerUseWal(
151e0 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74  pPager) || sqlit
151f0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
15200 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
15210 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63   0)).  ){.    rc
15220 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  2 = pagerUnlockD
15230 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
15240 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
15250 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
15260 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  one = 0;.  }.  p
15270 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
15280 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
15290 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
152a0 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  r = 0;..  return
152b0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
152c0 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
152d0 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
152e0 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
152f0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
15300 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
15310 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
15320 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
15330 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
15340 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
15350 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ROR state, do no
15360 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68  t attempt .** th
15370 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68  e rollback at th
15380 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64  is time. Instead
15390 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  , pager_unlock()
153a0 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a   is called. The.
153b0 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
153c0 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64  _unlock() will d
153d0 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
153e0 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f  mory pages, unlo
153f0 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ck.** the databa
15400 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65  se file and move
15410 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
15420 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49  to OPEN state. I
15430 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73  f this .** means
15440 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
15450 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66   hot-journal lef
15460 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
15470 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a  stem, the next .
15480 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  ** connection to
15490 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
154a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
154b0 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
154c0 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77   this one) .** w
154d0 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  ill roll it back
154e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
154f0 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72  ager has not alr
15500 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
15510 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75   ERROR state, bu
15520 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61  t an IO or.** ma
15530 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
15540 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  s during a rollb
15550 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77  ack, then this w
15560 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65  ill itself cause
15570 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74   .** the pager t
15580 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
15590 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77  R state. Which w
155a0 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62  ill be cleared b
155b0 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  y the.** call to
155c0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c   pager_unlock(),
155d0 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
155e0 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ove..*/.static v
155f0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
15600 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
15610 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15620 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15630 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
15640 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
15650 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
15660 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
15670 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
15680 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ger) );.    if( 
15690 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
156a0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
156b0 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  KED ){.      sql
156c0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
156d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
156e0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
156f0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
15700 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
15710 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15720 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
15730 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
15740 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
15750 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15760 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
15770 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
15780 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
15790 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
157a0 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f    }.  }.  pager_
157b0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
157c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
157d0 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
157e0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
157f0 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
15800 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
15810 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
15820 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
15830 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
15840 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
15850 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
15860 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
15870 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
15880 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
15890 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
158a0 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
158b0 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
158c0 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
158d0 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
158e0 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
158f0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
15900 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
15910 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
15920 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
15930 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
15940 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
15950 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
15960 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
15970 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
15980 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
15990 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
159a0 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
159b0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
159c0 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
159d0 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
159e0 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
159f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
15a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
15a10 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
15a20 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
15a30 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
15a40 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
15a50 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
15a60 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
15a70 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
15a80 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
15a90 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
15aa0 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
15ab0 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
15ac0 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
15ad0 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
15ae0 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
15af0 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
15b00 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
15b10 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
15b20 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
15b30 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
15b40 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
15b50 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
15b60 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
15b70 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
15b80 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
15b90 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
15ba0 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
15bb0 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
15bc0 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
15bd0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
15be0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
15bf0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
15c00 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
15c10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
15c20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15c30 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
15c40 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
15c50 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
15c60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
15c70 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
15c80 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
15c90 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
15ca0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
15cb0 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
15cc0 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
15cd0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15ce0 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
15cf0 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
15d00 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
15d10 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
15d20 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
15d30 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
15d40 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
15d50 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
15d60 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15d70 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15d90 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
15da0 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
15db0 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
15dc0 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
15dd0 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
15de0 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
15df0 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
15e00 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
15e10 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
15e20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15e30 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
15e40 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20 73  ed bits is the s
15e50 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74 69  ame in the desti
15e60 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20  nation.** pager 
15e70 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65 20  as it is in the 
15e80 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f  source.  This co
15e90 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56 41  mes up when a VA
15ea0 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65  CUUM changes the
15eb0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  .** number of re
15ec0 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20 74  served bits to t
15ed0 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f  he "optimal" amo
15ee0 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
15ef0 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65  ite3PagerAlignRe
15f00 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44 65  serve(Pager *pDe
15f10 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29  st, Pager *pSrc)
15f20 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  {.  if( pDest->n
15f30 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e  Reserve!=pSrc->n
15f40 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70  Reserve ){.    p
15f50 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d  Dest->nReserve =
15f60 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b   pSrc->nReserve;
15f70 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
15f80 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d  Size(pDest);.  }
15f90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15fa0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
15fb0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
15fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15fd0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
15fe0 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
15ff0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
16000 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
16010 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
16020 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
16030 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
16040 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
16050 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
16060 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
16070 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
16080 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
16090 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
160a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
160b0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
160c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
160d0 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
160e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
160f0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
16100 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
16110 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16120 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
16130 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
16140 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
16150 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
16160 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
16170 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
16180 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
16190 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
161a0 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
161b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
161c0 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
161d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
161e0 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
161f0 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
16200 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
16210 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
16220 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
16230 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
16240 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
16250 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
16260 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
16270 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
16280 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
16290 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
162a0 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
162b0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
162c0 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
162d0 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
162e0 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
162f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
16300 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
16310 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
16320 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16330 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
16340 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
16350 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
16360 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
16370 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
16380 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
16390 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
163a0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
163b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
163c0 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
163d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
163e0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
163f0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
16400 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
16410 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
16420 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16430 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16440 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
16450 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
16460 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
16470 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
16480 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
16490 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
164a0 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
164b0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
164c0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
164d0 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
164e0 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
164f0 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
16500 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16510 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
16520 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
16530 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
16540 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
16550 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
16560 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
16570 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
16580 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
16590 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
165a0 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
165b0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
165c0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
165d0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
165e0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
165f0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
16600 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
16610 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
16620 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
16630 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
16640 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
16650 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
16660 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
16670 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
16680 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16690 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
166a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
166b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
166c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
166d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
166e0 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
166f0 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
16700 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
16710 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
16720 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
16730 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
16740 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
16750 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
16760 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
16770 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
16780 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
16790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
167a0 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
167b0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
167c0 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
167d0 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
167e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
167f0 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
16800 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
16810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
16820 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
16830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16840 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
16850 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
16860 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
16890 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
168a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
168b0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
168c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
168d0 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
168e0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
168f0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
16900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16910 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
16920 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
16930 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
16940 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
16950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
16960 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
16970 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
16980 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
16990 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
169a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
169b0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
169c0 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66 64  s synced */.#ifd
169d0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
169e0 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72 6e  DEC.  /* The jrn
169f0 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72 75  lEnc flag is tru
16a00 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61 67  e if Journal pag
16a10 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  es should be pas
16a20 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  sed through.  **
16a30 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74 20   the codec.  It 
16a40 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75 72  is false for pur
16a50 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
16a60 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  nals. */.  const
16a70 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20 28   int jrnlEnc = (
16a80 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 50  isMainJrnl || pP
16a90 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
16aa0 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  ry==0);.#endif..
16ab0 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
16ac0 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
16ad0 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
16ae0 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
16af0 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
16b00 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
16b10 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
16b20 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
16b30 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
16b40 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
16b50 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
16b60 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
16b70 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
16b80 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
16b90 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
16ba0 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
16bb0 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
16bc0 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
16bd0 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
16be0 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
16bf0 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
16c00 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
16c10 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
16c20 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
16c30 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
16c40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16c50 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
16c60 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
16c70 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
16c80 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
16c90 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
16ca0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16cb0 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
16cc0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
16cd0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
16ce0 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
16cf0 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
16d00 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
16d10 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
16d20 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
16d30 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
16d40 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
16d50 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
16d60 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
16d70 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
16d80 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
16d90 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
16da0 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
16db0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
16dc0 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
16dd0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
16de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16df0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16e00 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
16e10 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
16e20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
16e30 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
16e40 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16e50 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
16e60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16e70 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16e80 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
16e90 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
16ea0 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
16eb0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
16ec0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
16ed0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
16ee0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
16ef0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16f00 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
16f10 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
16f20 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
16f30 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
16f40 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
16f50 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
16f60 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
16f70 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
16f80 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
16f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16fa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16fb0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16fc0 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
16fd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16fe0 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
16ff0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17000 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17010 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
17020 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17030 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
17040 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
17050 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
17060 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
17070 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
17080 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
17090 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
170a0 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
170b0 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
170c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
170d0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
170e0 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
170f0 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
17100 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
17110 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
17120 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
17130 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
17140 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
17150 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
17160 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
17170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
17180 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
17190 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
171a0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
171b0 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
171c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
171d0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
171e0 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
171f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
17200 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
17210 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
17220 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17230 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17240 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
17250 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
17260 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
17270 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
17280 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
17290 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
172a0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
172b0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
172c0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
172d0 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
172e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
172f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17300 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
17310 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
17320 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f  played back befo
17330 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
17340 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
17350 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
17360 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
17370 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
17380 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
17390 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
173a0 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
173b0 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
173c0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
173d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
173e0 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
173f0 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
17400 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
17410 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
17420 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
17430 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
17440 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
17450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
17460 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
17470 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
17480 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
17490 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
174a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
174b0 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
174c0 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
174d0 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
174e0 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
174f0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17500 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
17510 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
17520 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
17530 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
17540 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
17550 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
17560 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
17570 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
17580 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
17590 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
175a0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
175b0 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
175c0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
175d0 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
175e0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
175f0 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
17600 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
17610 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
17620 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
17630 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
17640 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
17650 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
17660 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
17670 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
17680 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
17690 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
176a0 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
176b0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
176c0 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
176d0 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
176e0 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
176f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
17700 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
17710 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
17720 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
17730 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
17740 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
17750 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
17760 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
17770 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
17780 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
17790 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
177a0 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
177b0 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
177c0 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
177d0 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
177e0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
177f0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
17800 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
17810 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
17820 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
17830 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
17840 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
17850 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
17860 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
17870 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
17880 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
17890 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
178a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
178b0 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
178c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
178d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
178e0 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
178f0 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
17900 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
17910 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
17920 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
17930 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
17940 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
17950 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
17960 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
17970 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
17980 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
17990 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
179a0 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
179b0 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
179c0 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
179d0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
179e0 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
179f0 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
17a00 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
17a10 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
17a20 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
17a30 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
17a40 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
17a50 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
17a60 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
17a70 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
17a80 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
17a90 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
17aa0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
17ab0 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
17ac0 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
17ad0 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
17ae0 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
17af0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
17b00 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
17b10 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
17b20 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
17b30 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
17b40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
17b50 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
17b60 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
17b70 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
17b80 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
17b90 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
17ba0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
17bb0 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
17bc0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
17bd0 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
17be0 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
17bf0 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
17c00 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
17c10 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
17c20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
17c30 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
17c40 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
17c50 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
17c60 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
17c70 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
17c80 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
17c90 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
17ca0 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
17cb0 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
17cc0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
17cd0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
17ce0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
17cf0 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  {.    pPg = sqli
17d00 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
17d10 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
17d20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20  }.  assert( pPg 
17d30 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
17d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17d50 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
17d60 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70  N || pPg==0 || p
17d70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
17d80 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
17d90 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
17da0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
17db0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
17dc0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
17dd0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
17de0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
17df0 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
17e00 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
17e10 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
17e20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
17e30 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
17e40 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
17e50 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
17e60 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
17e70 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
17e80 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
17e90 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
17ea0 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
17eb0 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
17ec0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
17ed0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
17ee0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
17ef0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
17f00 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
17f10 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
17f20 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
17f30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
17f40 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
17f50 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
17f60 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
17f70 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
17f80 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
17f90 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
17fa0 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
17fb0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
17fc0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
17fd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
17fe0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17ff0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 57  er) );..    /* W
18000 72 69 74 65 20 74 68 65 20 64 61 74 61 20 72 65  rite the data re
18010 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
18020 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  nal back into th
18030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18040 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
18050 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76 65  usually safe eve
18060 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  n for an encrypt
18070 65 64 20 64 61 74 61 62 61 73 65 20 2d 20 61 73  ed database - as
18080 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
18090 20 77 61 73 20 65 6e 63 72 79 70 74 65 64 20 62   was encrypted b
180a0 65 66 6f 72 65 20 69 74 20 77 61 73 20 77 72 69  efore it was wri
180b0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
180c0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65 78  nal file. The ex
180d0 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ception.    ** i
180e0 73 20 69 66 20 74 68 65 20 64 61 74 61 20 77 61  s if the data wa
180f0 73 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  s just read from
18100 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75   an in-memory su
18110 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74 68  b-journal. In th
18120 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 69  at.    ** case i
18130 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79 70  t must be encryp
18140 74 65 64 20 68 65 72 65 20 62 65 66 6f 72 65 20  ted here before 
18150 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
18160 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
18170 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f 0a     ** file.  */.
18180 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
18190 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
181a0 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20  !jrnlEnc ){.    
181b0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
181c0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c   aData, pgno, 7,
181d0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
181e0 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20  _BKPT, aData);. 
181f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18200 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
18210 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
18220 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18230 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 20  ze, ofst);.     
18240 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
18250 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
18260 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rc=SQLITE_NOMEM_
18270 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  BKPT);.    }else
18280 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
18290 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
182a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20  pPager->fd, (u8 
182b0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
182c0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
182d0 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  ;..    if( pgno>
182e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
182f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
18300 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
18310 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
18320 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
18330 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20 53  ckup ){.#ifdef S
18340 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18350 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e        if( jrnlEn
18360 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f 44  c ){.        COD
18370 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
18380 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
18390 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
183a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
183b0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
183c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
183d0 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
183e0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
183f0 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
18400 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
18410 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 61  ITE_NOMEM_BKPT,a
18420 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Data);.      }el
18430 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
18440 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
18450 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
18460 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
18470 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
18480 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69  }else if( !isMai
18490 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20  nJrnl && pPg==0 
184a0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
184b0 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
184c0 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61  of a savepoint a
184d0 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20  nd data was not 
184e0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
184f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
18500 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
18510 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68  ot in-memory, th
18520 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69  ere is a potenti
18530 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65  al.    ** proble
18540 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65  m. When the page
18550 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64   is next fetched
18560 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
18570 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a  ayer, it .    **
18580 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
18590 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
185a0 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20  file, which may 
185b0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20  or may not be . 
185c0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a     ** current. .
185d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
185e0 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65  ere are a couple
185f0 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61   of different wa
18600 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ys this can happ
18610 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74  en. All are quit
18620 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65  e.    ** obscure
18630 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  . When running i
18640 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  n synchronous mo
18650 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c  de, this can onl
18660 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a  y happen .    **
18670 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
18680 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
18690 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
186a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
186b0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f  , then.    ** po
186c0 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f  pulated, then mo
186d0 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
186e0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
186f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18700 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
18710 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d  to add an in-mem
18720 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20  ory page to the 
18730 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cache containing
18740 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
18750 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
18760 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
18770 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
18780 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20  s dirty .    ** 
18790 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72  and if the pager
187a0 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72   requires a jour
187b0 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d  nal-sync, then m
187c0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
187d0 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e  .    ** requirin
187e0 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  g a journal-sync
187f0 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
18800 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
18810 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
18820 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pnt );.    asser
18830 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
18840 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
18850 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20  AG_ROLLBACK)==0 
18860 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
18870 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
18880 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b  LLFLAG_ROLLBACK;
18890 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
188a0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
188b0 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
188c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
188d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
188e0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
188f0 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20  LLBACK)!=0 );.  
18900 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
18910 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
18920 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
18930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18940 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
18950 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
18960 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
18970 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
18980 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
18990 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
189a0 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
189b0 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
189c0 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
189d0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
189e0 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
189f0 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
18a00 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
18a10 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
18a20 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
18a30 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
18a40 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
18a50 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
18a60 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
18a70 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
18a80 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
18a90 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
18aa0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
18ab0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
18ac0 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
18ad0 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20  Data;.    pData 
18ae0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
18af0 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
18b00 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
18b10 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18b20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
18b30 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 2f  iter(pPg);.    /
18b40 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  * It used to be 
18b50 74 68 61 74 20 73 71 6c 69 74 65 33 50 63 61 63  that sqlite3Pcac
18b60 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
18b70 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72 65   was called here
18b80 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74 68  .  But.    ** th
18b90 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e 67  at call was dang
18ba0 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e 6f  erous and had no
18bb0 20 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e 65   detectable bene
18bc0 66 69 74 20 73 69 6e 63 65 20 74 68 65 20 63 61  fit since the ca
18bd0 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  che.    ** is no
18be0 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20 62  rmally cleaned b
18bf0 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43  y sqlite3PcacheC
18c00 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72 20  leanAll() after 
18c10 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f 0a  rollback and so.
18c20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
18c30 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20 20  removed. */.    
18c40 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
18c50 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a  sh(pPg);..    /*
18c60 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
18c70 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
18c80 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
18c90 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
18ca0 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
18cb0 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
18cc0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
18cd0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
18ce0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
18cf0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
18d00 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
18d10 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
18d20 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
18d30 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
18d40 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
18d50 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
18d60 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
18d70 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a 72  CODEC.    if( jr
18d80 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31 28  nlEnc ){ CODEC1(
18d90 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
18da0 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
18db0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18dc0 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20  T); }.#endif.   
18dd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
18de0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
18df0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18e00 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
18e10 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
18e20 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
18e40 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
18e50 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
18e60 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
18e70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18e80 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
18e90 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
18ea0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
18eb0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
18ec0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
18ed0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18ee0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
18ef0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
18f00 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
18f10 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
18f20 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
18f30 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
18f40 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
18f50 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
18f60 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
18f70 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
18f80 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
18f90 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
18fa0 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
18fb0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
18fc0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
18fd0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
18fe0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
18ff0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
19000 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
19010 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
19020 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
19030 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
19040 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
19050 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
19060 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
19070 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
19080 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
19090 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
190a0 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
190b0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
190c0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
190d0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
190e0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
190f0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
19100 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
19110 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
19120 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
19130 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
19140 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
19150 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
19160 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
19170 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
19180 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
19190 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
191a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
191b0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
191c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
191d0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
191e0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
191f0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
19200 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
19210 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
19220 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
19230 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
19240 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19250 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
19260 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
19270 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
19280 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
19290 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
192a0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
192b0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
192c0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
192d0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
192e0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
192f0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
19300 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
19310 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
19320 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
19330 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
19340 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
19350 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
19360 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
19370 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
19380 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
19390 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
193a0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
193b0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
193c0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
193d0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
193e0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
193f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
19400 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
19410 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
19420 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
19430 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
19440 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
19450 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
19460 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
19470 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
19480 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
19490 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
194a0 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
194b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
194c0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
194d0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
194e0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
194f0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
19500 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
19510 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
19520 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19530 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
19540 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
19550 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
19560 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
19570 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
19580 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
19590 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
195a0 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
195b0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
195c0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
195d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
195e0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
195f0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19610 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
19620 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19630 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
19640 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
19650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
19660 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
19670 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
19680 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
19690 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
196a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
196b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
196c0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
196d0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
196e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
196f0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
19700 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
19710 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
19720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19730 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
19740 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
19750 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
19760 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
19770 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
19780 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
19790 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
197a0 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
197b0 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
197c0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
197d0 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
197e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
197f0 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
19800 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
19810 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
19820 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
19830 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
19840 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
19850 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
19860 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
19870 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
19880 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19890 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
198a0 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
198b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
198c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
198d0 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
198e0 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
198f0 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
19900 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
19910 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
19920 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
19930 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
19940 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
19950 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
19960 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
19970 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
19980 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
19990 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
199a0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
199b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
199c0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
199d0 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
199e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
199f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19a00 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19a10 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65  .  /* Load the e
19a20 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
19a30 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
19a40 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
19a50 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  om.  ** sqlite3_
19a60 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  malloc() and poi
19a70 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
19a80 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73  erJournal.   Als
19a90 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75  o obtain.  ** su
19aa0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28  fficient space (
19ab0 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74  in zMasterPtr) t
19ac0 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
19ad0 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20   of master.  ** 
19ae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78  journal files ex
19af0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67  tracted from reg
19b00 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  ular rollback-jo
19b10 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72  urnals..  */.  r
19b20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
19b30 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
19b40 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
19b50 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19b60 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19b70 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61  aster_out;.  nMa
19b80 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
19b90 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
19ba0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19bb0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
19bc0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
19bd0 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b  nMasterPtr + 1);
19be0 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a  .  if( !zMasterJ
19bf0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
19c00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
19c10 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64  BKPT;.    goto d
19c20 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19c30 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d  }.  zMasterPtr =
19c40 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
19c50 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b  [nMasterJournal+
19c60 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1];.  rc = sqlit
19c70 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
19c80 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
19c90 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
19ca0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28  urnal, 0);.  if(
19cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19cc0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19cd0 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  out;.  zMasterJo
19ce0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
19cf0 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a  rnal] = 0;..  zJ
19d00 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
19d10 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65  Journal;.  while
19d20 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
19d30 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
19d40 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
19d50 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
19d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19d70 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
19d80 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
19d90 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
19da0 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72  ists);.    if( r
19db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19dc0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19dd0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
19de0 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
19df0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  {.      /* One o
19e00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
19e10 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
19e20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19e30 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a  exists..      **
19e40 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
19e50 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
19e60 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
19e70 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
19e80 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
19e90 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
19ea0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19eb0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  l file..      */
19ec0 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  .      int c;.  
19ed0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
19ee0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
19ef0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
19f00 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
19f10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19f20 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19f30 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
19f40 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
19f50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19f70 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19f80 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
19f90 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
19fa0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
19fb0 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
19fc0 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
19fd0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
19fe0 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
19ff0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a010 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a020 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1a030 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
1a040 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
1a050 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
1a060 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
1a070 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
1a080 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
1a090 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
1a0a0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1a0b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
1a0c0 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  /.        goto d
1a0d0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a0e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a0f0 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c  zJournal += (sql
1a100 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
1a110 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20  urnal)+1);.  }. 
1a120 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
1a130 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  e(pMaster);.  rc
1a140 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1a150 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
1a160 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
1a170 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
1a180 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
1a190 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73  nal);.  if( pMas
1a1a0 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
1a1b0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
1a1c0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
1a1d0 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
1a1e0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1a1f0 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
1a200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a210 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1a220 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1a230 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
1a240 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
1a250 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
1a260 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
1a270 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
1a280 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
1a290 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
1a2a0 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
1a2b0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
1a2c0 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
1a2d0 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
1a2e0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
1a2f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
1a300 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1a310 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
1a320 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  r the pager is n
1a330 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ot in either.** 
1a340 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74  DBMOD or OPEN st
1a350 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
1a360 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
1a370 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
1a380 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  ze .** of the fi
1a390 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  le is changed to
1a3a0 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
1a3b0 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
1a3c0 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a  Size bytes). .**
1a3d0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
1a3e0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
1a3f0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
1a400 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
1a410 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
1a420 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
1a430 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
1a440 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
1a450 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
1a460 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
1a470 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
1a480 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
1a490 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
1a4a0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
1a4b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
1a4c0 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
1a4d0 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
1a4e0 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
1a4f0 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
1a500 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
1a510 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
1a520 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
1a530 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
1a540 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
1a550 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
1a560 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
1a570 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
1a580 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1a590 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
1a5a0 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
1a5b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1a5c0 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
1a5d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a5e0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
1a5f0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
1a600 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
1a610 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
1a620 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
1a630 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
1a640 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a650 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1a660 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1a670 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
1a680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a690 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
1a6a0 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
1a6b0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1a6c0 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
1a6d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1a6e0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1a6f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1a700 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
1a710 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
1a720 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
1a730 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
1a740 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
1a750 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
1a760 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1a770 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1a780 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   );.    /* TODO:
1a790 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
1a7a0 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
1a7b0 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
1a7c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1a7d0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1a7e0 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
1a7f0 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
1a800 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61   szPage*(i64)nPa
1a810 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
1a820 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
1a830 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
1a840 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
1a850 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
1a860 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
1a870 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
1a880 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
1a890 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
1a8a0 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72   }else if( (curr
1a8b0 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c  entSize+szPage)<
1a8c0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
1a8d0 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
1a8e0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1a8f0 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
1a900 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
1a910 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
1a920 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1a930 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65  szPage) == curre
1a940 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1a950 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1a960 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20  Size-szPage) >  
1a970 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1a980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a990 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1a9a0 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50  r->fd, pTmp, szP
1a9b0 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50  age, newSize-szP
1a9c0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1a9d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a9e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a9f0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
1aa00 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1aa10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1aa20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1aa30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61  *.** Return a sa
1aa40 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  nitized version 
1aa50 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  of the sector-si
1aa60 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46  ze of OS file pF
1aa70 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ile. The.** retu
1aa80 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72  rn value is guar
1aa90 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65  anteed to lie be
1aaa0 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58  tween 32 and MAX
1aab0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
1aac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74  .int sqlite3Sect
1aad0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1aae0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
1aaf0 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65  nt iRet = sqlite
1ab00 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46  3OsSectorSize(pF
1ab10 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74  ile);.  if( iRet
1ab20 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20  <32 ){.    iRet 
1ab30 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = 512;.  }else i
1ab40 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54  f( iRet>MAX_SECT
1ab50 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
1ab60 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
1ab70 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
1ab80 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45     iRet = MAX_SE
1ab90 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
1aba0 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
1abb0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
1abc0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
1abd0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1abe0 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
1abf0 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
1ac00 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
1ac10 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1ac20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
1ac30 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
1ac40 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1ac50 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
1ac60 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
1ac70 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
1ac80 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
1ac90 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
1aca0 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
1acb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
1acc0 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
1acd0 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
1ace0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
1acf0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
1ad00 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1ad10 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
1ad20 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
1ad30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1ad40 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
1ad50 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
1ad60 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1ad70 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
1ad80 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1ad90 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
1ada0 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
1adb0 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
1adc0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
1add0 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
1ade0 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
1adf0 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
1ae00 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
1ae10 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1ae20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1ae30 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45  e has the SQLITE
1ae40 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1ae50 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65  _OVERWRITE prope
1ae60 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  rty, then set.**
1ae70 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1ae80 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74  ector size to it
1ae90 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  s minimum value 
1aea0 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70  (512).  The purp
1aeb0 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72  ose of.** pPager
1aec0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
1aed0 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62  to define the "b
1aee0 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20  last radius" of 
1aef0 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69  bytes that.** mi
1af00 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20  ght change if a 
1af10 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69  crash occurs whi
1af20 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  le writing to a 
1af30 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a  single byte in.*
1af40 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42  * that range.  B
1af50 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46  ut with POWERSAF
1af60 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65  E_OVERWRITE, the
1af70 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73   blast radius is
1af80 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69   zero.** (that i
1af90 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45  s what POWERSAFE
1afa0 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73  _OVERWRITE means
1afb0 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a  ), so we minimiz
1afc0 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20  e the sector.** 
1afd0 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77  size.  For backw
1afe0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
1aff0 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ty of the rollba
1b000 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
1b010 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61  format,.** we ca
1b020 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20  nnot reduce the 
1b030 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1b040 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e   size below 512.
1b050 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b060 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
1b070 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b080 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1b090 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1b0a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1b0b0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1b0c0 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20  >tempFile.   || 
1b0d0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1b0e0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1b0f0 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20  pPager->fd) & . 
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b110 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1b120 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d  AFE_OVERWRITE)!=
1b130 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  0.  ){.    /* Se
1b140 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
1b150 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
1b160 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
1b170 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
1b180 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
1b190 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
1b1a0 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
1b1b0 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
1b1c0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
1b1d0 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f  ill segfault. */
1b1e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1b1f0 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
1b200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
1b210 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1b220 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1b230 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
1b240 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
1b250 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
1b260 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
1b270 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1b280 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
1b290 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
1b2a0 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
1b2b0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
1b2c0 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
1b2d0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1b2e0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
1b2f0 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
1b300 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
1b310 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
1b320 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
1b330 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1b340 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1b350 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1b360 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
1b370 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
1b380 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1b390 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
1b3a0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1b3b0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1b3c0 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
1b3d0 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
1b3e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
1b3f0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
1b400 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b410 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b420 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
1b430 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
1b440 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
1b450 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
1b460 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
1b470 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1b480 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
1b490 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
1b4a0 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
1b4b0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1b4c0 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
1b4d0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1b4e0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b4f0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
1b500 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
1b510 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
1b520 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1b530 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
1b540 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b550 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b560 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
1b570 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
1b580 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
1b590 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
1b5a0 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
1b5b0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1b5c0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1b5d0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1b5e0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1b5f0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1b600 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1b610 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1b620 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1b630 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1b640 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1b650 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1b660 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1b670 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1b680 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1b690 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1b6a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1b6b0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1b6c0 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1b6d0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1b6e0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1b6f0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1b700 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1b710 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1b720 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1b730 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1b740 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1b750 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1b760 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1b770 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1b780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b790 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1b7a0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1b7b0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1b7c0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1b7d0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1b7e0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1b7f0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1b800 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1b810 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1b820 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1b830 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1b840 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1b850 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1b860 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1b870 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1b880 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1b890 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1b8a0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1b8b0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1b8c0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1b8d0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1b8e0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1b8f0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1b900 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1b910 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1b920 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1b930 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1b940 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1b950 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1b960 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1b970 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1b980 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1b990 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1b9a0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1b9b0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1b9c0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1b9d0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1b9e0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1b9f0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1ba00 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1ba10 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1ba20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1ba30 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1ba40 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1ba50 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1ba60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1ba70 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1ba80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1ba90 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1baa0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1bab0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1bac0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1bad0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1bae0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1baf0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1bb00 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1bb10 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1bb20 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1bb30 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1bb40 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1bb50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1bb60 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1bb70 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1bb80 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1bb90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1bba0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1bbb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1bbc0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1bbd0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1bbe0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1bbf0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1bc00 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1bc10 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1bc20 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1bc30 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1bc40 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1bc50 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1bc60 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1bc70 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1bc80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1bc90 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1bca0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1bcb0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1bcc0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1bcd0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1bce0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1bcf0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1bd00 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1bd10 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1bd20 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1bd30 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1bd40 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1bd50 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1bd60 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1bd70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1bd80 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1bd90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1bda0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1bdb0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1bdc0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1bdd0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1bde0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1bdf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1be00 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1be10 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1be20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1be30 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1be40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1be50 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1be60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1be70 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1be80 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1be90 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1bea0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1beb0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1bec0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1bed0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1bee0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1bef0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1bf00 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1bf10 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1bf20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1bf30 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1bf40 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1bf50 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1bf60 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1bf70 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1bf80 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1bf90 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1bfa0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1bfb0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1bfc0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1bfd0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1bfe0 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b  .  int nPlayback
1bff0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
1c000 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1c010 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72  ages restored fr
1c020 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20  om journal */.. 
1c030 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1c040 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1c050 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1c060 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1c070 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1c080 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1c090 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1c0a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1c0b0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1c0c0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1c0d0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1c0e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c0f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1c100 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1c110 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1c120 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1c130 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1c140 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1c150 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1c160 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1c170 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1c180 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1c190 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1c1a0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1c1b0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1c1c0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1c1d0 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1c1e0 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1c1f0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1c200 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1c210 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1c220 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1c230 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1c240 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1c250 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1c260 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1c270 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1c280 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1c290 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1c2a0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1c2b0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c2c0 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1c2d0 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1c2e0 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
1c2f0 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
1c300 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
1c310 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
1c320 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
1c330 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
1c340 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1c350 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
1c360 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1c370 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1c380 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1c390 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1c3a0 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
1c3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1c3c0 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
1c3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1c3e0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
1c3f0 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
1c400 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
1c410 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
1c420 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1c430 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
1c440 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1c450 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
1c460 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c470 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
1c480 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
1c490 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
1c4a0 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
1c4b0 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
1c4c0 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
1c4d0 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1c4e0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
1c4f0 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
1c500 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
1c510 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
1c520 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
1c530 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
1c540 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
1c550 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
1c560 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
1c570 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
1c580 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
1c590 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
1c5a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1c5b0 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
1c5c0 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
1c5d0 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
1c5e0 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
1c5f0 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61  ess must have fa
1c600 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
1c610 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
1c620 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
1c630 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
1c640 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1c650 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
1c660 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
1c670 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
1c680 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
1c690 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1c6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
1c6b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c6c0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1c6d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c6e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1c6f0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c700 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
1c710 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
1c720 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
1c730 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
1c740 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1c750 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
1c760 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1c770 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
1c780 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
1c790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1c7a0 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
1c7b0 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
1c7c0 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
1c7d0 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
1c7e0 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
1c7f0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1c800 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
1c810 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
1c820 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1c830 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
1c840 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c850 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1c860 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c870 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
1c880 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1c890 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
1c8a0 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
1c8b0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1c8c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1c8d0 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
1c8e0 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
1c8f0 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
1c900 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
1c910 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1c920 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
1c930 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
1c940 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
1c950 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
1c960 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
1c970 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
1c980 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1c990 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
1c9a0 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
1c9b0 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
1c9c0 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
1c9d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c9e0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
1c9f0 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
1ca00 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
1ca10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1ca20 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
1ca30 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
1ca40 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
1ca50 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
1ca60 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
1ca70 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
1ca80 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
1ca90 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
1caa0 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
1cab0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
1cac0 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
1cad0 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
1cae0 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
1caf0 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
1cb00 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
1cb10 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
1cb20 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
1cb30 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
1cb40 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
1cb50 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1cb60 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
1cb70 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
1cb80 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
1cb90 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1cba0 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1cbb0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1cbc0 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
1cbd0 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
1cbe0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1cbf0 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
1cc00 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1cc10 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
1cc20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1cc30 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1cc40 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1cc50 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1cc60 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
1cc70 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1cc80 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1cc90 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
1cca0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1ccb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1ccc0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1ccd0 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
1cce0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1ccf0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1cd00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1cd10 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
1cd20 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
1cd30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1cd40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1cd50 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1cd60 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1cd70 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
1cd80 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
1cd90 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1cda0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cdb0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cdc0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1cdd0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1cde0 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
1cdf0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
1ce00 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
1ce10 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
1ce20 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
1ce30 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
1ce40 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
1ce50 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
1ce60 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
1ce70 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
1ce80 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
1ce90 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
1cea0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1ceb0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1cec0 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1ced0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1cee0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1cef0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1cf00 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
1cf10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
1cf20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1cf30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cf40 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1cf50 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
1cf60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1cf70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1cf80 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1cf90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1cfa0 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1cfb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1cfc0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1cfd0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1cfe0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1cff0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1d000 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1d010 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1d020 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1d030 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1d040 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1d050 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1d060 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1d070 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1d080 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1d090 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1d0a0 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1d0b0 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1d0c0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1d0d0 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1d0e0 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1d0f0 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1d100 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1d110 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1d120 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1d130 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1d140 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1d150 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1d160 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1d170 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d180 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1d190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d1a0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1d1b0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1d1c0 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1d1d0 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1d1e0 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1d1f0 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1d200 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1d210 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1d220 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1d230 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1d240 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1d250 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1d260 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1d270 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1d280 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1d290 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1d2a0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1d2c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d2d0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1d2e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d2f0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1d300 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1d310 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1d320 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f  back:.  /* Follo
1d330 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  wing a rollback,
1d340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d350 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63  le should be bac
1d360 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61  k in its origina
1d370 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69  l.  ** state pri
1d380 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1d390 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
1d3a0 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68  on, so invoke th
1d3b0 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43  e.  ** SQLITE_FC
1d3c0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1d3d0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65   file-control me
1d3e0 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20  thod to disable 
1d3f0 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69  the.  ** asserti
1d400 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  on that the tran
1d410 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1d420 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  was modified..  
1d430 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d440 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1d450 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1d460 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
1d470 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
1d480 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  t(pPager->fd,SQL
1d490 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1d4a0 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23  HANGED,0);.  }.#
1d4b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1d4c0 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1d4d0 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1d4e0 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1d4f0 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1d500 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1d510 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1d520 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1d530 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1d540 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1d550 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1d560 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1d570 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1d580 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1d590 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1d5a0 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1d5b0 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1d5c0 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1d5d0 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1d5e0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1d5f0 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1d600 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1d610 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1d620 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1d630 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1d640 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1d650 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1d660 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1d670 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1d680 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1d690 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1d6a0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1d6b0 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1d6c0 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1d6d0 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1d6e0 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1d6f0 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1d700 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1d710 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1d720 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1d730 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1d740 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d750 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1d760 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1d770 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1d780 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1d790 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1d7a0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1d7b0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1d7c0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1d7d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1d7e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d7f0 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  K.   && (pPager-
1d800 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1d810 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1d820 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1d830 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a  AGER_OPEN).  ){.
1d840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d850 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72  PagerSync(pPager
1d860 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1d870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d880 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d890 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1d8a0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
1d8b0 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20  0]!='\0', 0);.  
1d8c0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1d8d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1d8e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d8f0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1d900 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
1d910 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1d920 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1d930 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
1d940 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
1d950 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
1d960 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
1d970 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
1d980 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1d990 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
1d9a0 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
1d9b0 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
1d9c0 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
1d9d0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1d9e0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   );.  }.  if( is
1d9f0 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b  Hot && nPlayback
1da00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1da10 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43  log(SQLITE_NOTIC
1da20 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
1da30 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25  CK, "recovered %
1da40 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22  d pages from %s"
1da50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1da60 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61    nPlayback, pPa
1da70 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
1da80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
1da90 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1daa0 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
1dab0 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
1dac0 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
1dad0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
1dae0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1daf0 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
1db00 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
1db10 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
1db20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
1db30 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1db40 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
1db50 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
1db60 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
1db70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1db80 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1db90 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
1dba0 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
1dbb0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
1dbc0 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1dbd0 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1dbe0 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1dbf0 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1dc00 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1dc10 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1dc20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1dc30 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1dc40 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1dc50 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1dc60 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1dc70 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1dc80 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1dc90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dca0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1dcb0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1dcc0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1dcd0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1dce0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1dcf0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1dd00 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dd10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dd20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1dd30 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d   *pPg, u32 iFram
1dd40 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  e){.  Pager *pPa
1dd50 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1dd60 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
1dd70 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
1dd80 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
1dd90 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
1dda0 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
1ddb0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1ddc0 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
1ddd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1dde0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ddf0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   code */.  int p
1de00 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  gsz = pPager->pa
1de10 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65  geSize; /* Numbe
1de20 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1de30 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
1de40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1de50 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1de60 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1de70 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1de80 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e  er->fd) );..#ifn
1de90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dea0 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65  WAL.  if( iFrame
1deb0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1dec0 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1ded0 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1dee0 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1def0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1df00 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72  ReadFrame(pPager
1df10 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20  ->pWal, iFrame, 
1df20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1df30 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
1df40 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f  f.  {.    i64 iO
1df50 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1df60 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1df70 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1df80 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1df90 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1dfa0 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66  pData, pgsz, iOf
1dfb0 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1dfc0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1dfd0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1dfe0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dff0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1e000 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1e010 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e020 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
1e030 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
1e040 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
1e050 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
1e060 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
1e070 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
1e080 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
1e090 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
1e0a0 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
1e0b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
1e0c0 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
1e0d0 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
1e0e0 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
1e0f0 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
1e100 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
1e110 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e120 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
1e130 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
1e140 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
1e150 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
1e160 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
1e170 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
1e180 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
1e190 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
1e1a0 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
1e1b0 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
1e1c0 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
1e1d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1e1e0 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
1e1f0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
1e200 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
1e210 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
1e220 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
1e230 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e240 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
1e250 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
1e260 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
1e270 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65  ** white noise e
1e280 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73  qualing 16 bytes
1e290 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69   of 0xff is vani
1e2a0 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f  shingly small so
1e2b0 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f  .      ** we sho
1e2c0 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e  uld still be ok.
1e2d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e2e0 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64  memset(pPager->d
1e2f0 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c  bFileVers, 0xff,
1e300 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1e310 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1e320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1e330 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
1e340 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
1e350 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65  a)[24];.      me
1e360 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1e370 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
1e380 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
1e390 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1e3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43  );.    }.  }.  C
1e3b0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
1e3c0 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
1e3d0 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
1e3e0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50  OMEM_BKPT);..  P
1e3f0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1e400 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
1e410 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
1e420 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
1e430 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
1e440 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
1e450 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1e460 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
1e470 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1e480 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1e4a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1e4b0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1e4c0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
1e4d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e4e0 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c  * Update the val
1e4f0 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
1e500 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73  -counter at offs
1e510 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e  ets 24 and 92 in
1e520 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61  .** the header a
1e530 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65  nd the sqlite ve
1e540 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20  rsion number at 
1e550 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a  offset 96..**.**
1e560 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f   This is an unco
1e570 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65  nditional update
1e580 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
1e590 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1e5a0 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f  ecounter().** ro
1e5b0 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79  utine which only
1e5c0 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1e5d0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74  nge-counter if t
1e5e0 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74  he update is act
1e5f0 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c  ually.** needed,
1e600 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   as determined b
1e610 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  y the pPager->ch
1e620 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74  angeCountDone st
1e630 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ate variable..*/
1e640 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1e650 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1e660 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50  ounter(PgHdr *pP
1e670 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  g){.  u32 change
1e680 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20  _counter;..  /* 
1e690 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1e6a0 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1e6b0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1e6c0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1e6d0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1e6e0 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
1e6f0 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67  e((u8*)pPg->pPag
1e700 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b  er->dbFileVers)+
1e710 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  1;.  put32bits((
1e720 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1e730 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
1e740 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c  unter);..  /* Al
1e750 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
1e760 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1e770 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
1e780 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62  99 and in.  ** b
1e790 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
1e7a0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
1e7b0 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
1e7c0 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
1e7d0 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e  r.  ** is valid.
1e7e0 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
1e7f0 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1e800 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63  ta)+92, change_c
1e810 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32  ounter);.  put32
1e820 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1e830 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
1e840 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
1e850 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ER);.}..#ifndef 
1e860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1e870 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e880 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
1e890 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
1e8a0 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1e8b0 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
1e8c0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
1e8d0 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
1e8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1e8f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
1e900 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
1e910 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1e920 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
1e930 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
1e940 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
1e950 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e960 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1e970 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
1e980 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
1e990 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
1e9a0 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
1e9b0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
1e9c0 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
1e9d0 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
1e9e0 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
1e9f0 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
1ea00 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
1ea10 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
1ea20 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
1ea30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ea40 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
1ea50 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
1ea60 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1ea70 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
1ea80 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
1ea90 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
1eaa0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1eab0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1eac0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
1ead0 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
1eae0 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
1eaf0 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
1eb00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1eb10 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1eb20 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1eb30 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
1eb40 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1eb50 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1eb60 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71  r) );.  pPg = sq
1eb70 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1eb80 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1eb90 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1eba0 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1ebb0 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1ebc0 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1ebd0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1ebe0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1ebf0 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61  {.      u32 iFra
1ec00 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  me = 0;.      rc
1ec10 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
1ec20 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1ec30 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Wal, pPg->pgno, 
1ec40 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
1ec50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ec60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1ec70 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1ec80 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
1ec90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1eca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ecb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1ecc0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
1ecd0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ece0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
1ecf0 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d  Null(pPg);.    }
1ed00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
1ed10 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61  lly, if a transa
1ed20 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1ed30 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70  back, any backup
1ed40 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20   processes are. 
1ed50 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64   ** updated as d
1ed60 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75  ata is copied ou
1ed70 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  t of the rollbac
1ed80 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e  k journal and in
1ed90 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
1eda0 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  base. This is no
1edb0 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73  t generally poss
1edc0 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20  ible with a WAL 
1edd0 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a  database, as.  *
1ede0 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c  * rollback invol
1edf0 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63  ves simply trunc
1ee00 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  ating the log fi
1ee10 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69  le. Therefore, i
1ee20 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f  f one.  ** or mo
1ee30 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61  re frames have a
1ee40 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1ee50 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28  ten to the log (
1ee60 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20  and therefore . 
1ee70 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20   ** also copied 
1ee80 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20  into the backup 
1ee90 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61  databases) as pa
1eea0 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  rt of this trans
1eeb0 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
1eec0 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65   backups must be
1eed0 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f   restarted..  */
1eee0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
1eef0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
1ef00 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74  pBackup);..  ret
1ef10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ef20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ef30 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
1ef40 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1ef50 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61  on on a WAL data
1ef60 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
1ef70 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  int pagerRollbac
1ef80 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  kWal(Pager *pPag
1ef90 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1efc0 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72   Code */.  PgHdr
1efd0 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
1efe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1eff0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1f000 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a  s to revert */..
1f010 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67    /* For all pag
1f020 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
1f030 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
1f040 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65  ly dirty or have
1f050 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
1f060 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20  en written (but 
1f070 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74  not committed) t
1f080 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20  o the log file, 
1f090 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20  do one of the . 
1f0a0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20   ** following:. 
1f0b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73   **.  **   + Dis
1f0c0 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20  card the cached 
1f0d0 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e  page (if refcoun
1f0e0 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20  t==0), or.  **  
1f0f0 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63   + Reload page c
1f100 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1f110 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66  database (if ref
1f120 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20  count>0)..  */. 
1f130 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1f140 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
1f150 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1f160 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67  ite3WalUndo(pPag
1f170 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55  er->pWal, pagerU
1f180 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  ndoCallback, (vo
1f190 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20  id *)pPager);.  
1f1a0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1f1b0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1f1c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1f1d0 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1f1e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1f1f0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1f200 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
1f210 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  irty;.    rc = p
1f220 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1f230 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c  ((void *)pPager,
1f240 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1f250 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
1f260 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f270 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f280 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1f290 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
1f2a0 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1f2b0 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f  ). As well as lo
1f2c0 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  gging.** the con
1f2d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73  tents of the lis
1f2e0 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65  t of pages heade
1f2f0 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e  d by pList (conn
1f300 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29  ected by pDirty)
1f310 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1f320 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20  on notifies any 
1f330 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72  active backup pr
1f340 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65  ocesses that the
1f350 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63   pages have.** c
1f360 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  hanged. .**.** T
1f370 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1f380 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
1f390 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77  s routine is alw
1f3a0 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61  ays sorted by pa
1f3b0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65  ge number..** He
1f3c0 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61  nce, if page 1 a
1f3d0 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20  ppears anywhere 
1f3e0 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20  on the list, it 
1f3f0 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
1f400 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74  t page..*/ .stat
1f410 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
1f420 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
1f430 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
1f440 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1f450 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
1f460 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f480 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
1f490 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
1f4a0 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1f4c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
1f4d0 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
1f4e0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1f510 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
1f520 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f550 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1f560 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  nList;          
1f570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f580 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1f590 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48  n pList */.  PgH
1f5a0 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5c0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f5d0 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73   pages */..  ass
1f5e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
1f5f0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1f600 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53  List );.#ifdef S
1f610 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1f620 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1f630 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e   page list is in
1f640 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
1f650 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73   */.  for(p=pLis
1f660 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74  t; p && p->pDirt
1f670 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  y; p=p->pDirty){
1f680 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1f690 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79  pgno < p->pDirty
1f6a0 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65  ->pgno );.  }.#e
1f6b0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1f6c0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
1f6d0 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   || isCommit );.
1f6e0 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29    if( isCommit )
1f6f0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41  {.    /* If a WA
1f700 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1f710 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
1f720 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  , there is no po
1f730 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20  int in writing. 
1f740 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20     ** any pages 
1f750 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1f760 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
1f770 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68  Truncate into th
1f780 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20  e WAL file..    
1f790 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76  ** They will nev
1f7a0 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e  er be read by an
1f7b0 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d  y client. So rem
1f7c0 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
1f7d0 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20  e pDirty.    ** 
1f7e0 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20  list here. */.  
1f7f0 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1f800 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1f810 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1f820 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1f830 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1f840 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1f850 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1f860 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1f870 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1f880 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1f890 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1f8a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1f8b0 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1f8c0 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1f8d0 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1f8e0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1f8f0 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1f900 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1f910 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1f920 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1f930 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1f940 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1f950 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1f960 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1f970 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1f980 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1f990 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1f9a0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1f9b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1f9c0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1f9d0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1f9e0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1f9f0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1fa00 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
1fa10 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
1fa20 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e  >pBackup, p->pgn
1fa30 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74  o, (u8 *)p->pDat
1fa40 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  a);.    }.  }..#
1fa50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1fa60 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74  CK_PAGES.  pList
1fa70 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1fa80 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1fa90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f  ->pPCache);.  fo
1faa0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1fab0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1fac0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
1fad0 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  sh(p);.  }.#endi
1fae0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
1faf0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1fb00 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1fb10 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
1fb20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fb30 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
1fb40 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
1fb50 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
1fb60 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
1fb70 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
1fb80 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
1fb90 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
1fba0 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
1fbb0 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
1fbc0 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
1fbd0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
1fbe0 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
1fbf0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
1fc00 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
1fc10 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
1fc20 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
1fc30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fc40 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1fc50 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
1fc60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1fc90 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
1fca0 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
1fcb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1fcc0 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
1fcd0 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
1fce0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
1fcf0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
1fd00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fd10 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1fd20 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
1fd30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
1fd40 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
1fd50 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1fd60 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
1fd70 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
1fd80 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
1fd90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1fda0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
1fdb0 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
1fdc0 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
1fdd0 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
1fde0 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
1fdf0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
1fe00 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
1fe10 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
1fe20 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
1fe30 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
1fe40 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1fe50 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1fe60 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1fe70 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
1fe80 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1fe90 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1fea0 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
1feb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fec0 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
1fed0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1fee0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1fef0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
1ff00 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
1ff10 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
1ff20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
1ff30 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1ff40 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
1ff50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ff60 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
1ff70 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
1ff80 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
1ff90 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
1ffa0 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
1ffb0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1ffc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1ffd0 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
1ffe0 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
1fff0 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
20000 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
20010 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
20020 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20030 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
20040 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
20050 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20060 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
20070 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
20080 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
20090 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
200a0 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
200b0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
200c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
200d0 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
200e0 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
200f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
20100 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
20110 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
20120 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
20130 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
20140 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
20150 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
20160 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
20170 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
20180 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
20190 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
201a0 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
201b0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
201c0 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
201d0 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
201e0 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
201f0 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
20200 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20210 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
20220 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
20230 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
20240 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
20250 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
20260 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
20270 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
20280 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
20290 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
202a0 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
202b0 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
202c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
202d0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
202e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
202f0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20300 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20310 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20320 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
20330 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
20340 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65  le==0 );.  nPage
20350 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
20360 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
20370 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20380 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
20390 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
203a0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
203b0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57   from the.  ** W
203c0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64  AL sub-system, d
203d0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67  etermine the pag
203e0 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e  e count based on
203f0 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a   the size of.  *
20400 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
20410 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a  ile.  If the siz
20420 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20430 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
20440 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75  .  ** integer mu
20450 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
20460 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75  ge-size, round u
20470 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  p the result..  
20480 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
20490 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70  0 && ALWAYS(isOp
204a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
204b0 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
204c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
204d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
204e0 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
204f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
20500 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
20510 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
20520 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  n);.    if( rc!=
20530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20540 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20550 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
20560 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
20570 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
20580 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20590 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
205a0 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
205b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
205c0 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
205d0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
205e0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
205f0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
20600 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
20610 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
20620 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20630 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20640 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20650 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
20660 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
20670 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
20680 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
20690 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
206a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
206b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
206c0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
206d0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
206e0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
206f0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
20700 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
20710 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
20720 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20730 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20740 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20750 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
20760 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20770 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
20780 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
20790 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
207a0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
207b0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
207c0 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
207d0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
207e0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
207f0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20800 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20810 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20820 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20830 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20840 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20850 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
20860 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20870 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20880 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20890 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
208a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
208b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
208c0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
208d0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
208e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
208f0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20900 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20910 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20920 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20930 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20940 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20950 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
20960 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
20970 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
20980 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
20990 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
209a0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
209b0 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
209c0 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
209d0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
209e0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
209f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20a00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20a10 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20a20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20a30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20a40 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20a50 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20a60 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20a80 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20a90 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
20aa0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20ab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20ac0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20ad0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20ae0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20af0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
20b00 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20b10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20b30 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20b40 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20b50 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20b60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20b70 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
20b80 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20ba0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
20bb0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
20bc0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
20bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
20be0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
20bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20c00 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
20c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20c20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20c30 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20c40 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20c50 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
20c60 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20c70 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
20c80 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
20c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ca0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
20cb0 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
20cc0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
20cd0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
20ce0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20cf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20d00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20d10 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
20d20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
20d30 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20d40 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
20d50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
20d60 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20d70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20d80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20d90 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
20da0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
20db0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20dc0 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
20dd0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
20de0 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
20df0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
20e00 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
20e10 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
20e20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20e30 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
20e40 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
20e50 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
20e60 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
20e70 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
20e80 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
20e90 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
20ea0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
20eb0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
20ec0 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
20ed0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
20ee0 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
20ef0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
20f00 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
20f10 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
20f20 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
20f30 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
20f40 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
20f50 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
20f60 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
20f70 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
20f80 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20f90 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20fa0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
20fb0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
20fc0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20fd0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20fe0 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
20ff0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21000 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
21010 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21020 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
21030 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
21040 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21050 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
21060 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
21070 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21080 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
21090 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
210a0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
210b0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
210c0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
210d0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
210e0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
210f0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
21100 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
21110 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21120 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
21130 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
21140 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
21150 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
21160 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
21170 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
21180 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
21190 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
211a0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
211b0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
211c0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
211d0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
211e0 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
211f0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
21200 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
21210 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
21220 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
21230 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
21240 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
21250 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
21260 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
21270 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
21280 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
21290 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
212a0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
212b0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
212c0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
212d0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
212e0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
212f0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
21300 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
21310 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
21320 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
21330 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
21340 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
21350 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
21360 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
21370 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
21380 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
21390 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
213a0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
213b0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
213c0 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
213d0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
213e0 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
213f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
21400 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
21410 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
21420 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
21430 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
21440 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
21450 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
21460 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
21470 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
21480 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
21490 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
214a0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
214b0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
214c0 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
214d0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
214e0 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
21510 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
21520 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
21530 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
21540 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
21550 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
21560 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
21570 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
21580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21590 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
215a0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
215b0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
215c0 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
215d0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
215e0 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
215f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21600 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
21610 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
21620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21630 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
21640 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
21650 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
21660 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
21670 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
21680 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
21690 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
216a0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
216b0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
216c0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
216d0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
216e0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
216f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21700 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
21710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
21720 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
21730 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
21740 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
21750 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
21760 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
21770 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
21780 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
21790 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
217a0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
217b0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
217c0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
217d0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
217e0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
217f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
21800 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
21810 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
21820 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21830 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
21840 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
21850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
21860 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21870 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
21880 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21890 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
218a0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
218b0 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
218c0 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
218d0 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
218e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
218f0 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
21900 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
21910 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
21920 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
21930 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21940 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
21950 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
21960 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
21970 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
21980 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21990 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
219a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
219b0 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
219c0 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
219d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
219e0 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
219f0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21a00 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
21a10 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
21a20 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
21a30 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
21a40 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
21a50 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
21a60 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
21a70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
21a80 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
21a90 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
21aa0 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
21ab0 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
21ac0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
21ad0 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
21ae0 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
21af0 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
21b00 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
21b10 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
21b20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21b30 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
21b40 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21b50 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
21b60 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
21b70 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
21b80 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
21b90 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
21ba0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
21bb0 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
21bc0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
21bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21be0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21bf0 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
21c00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21c10 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21c20 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21c30 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21c40 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21c50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21c60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
21c80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21c90 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
21ca0 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
21cb0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
21cc0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21cd0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21ce0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
21cf0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
21d00 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
21d10 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
21d20 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
21d30 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21d40 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
21d50 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
21d60 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
21d70 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
21d80 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
21d90 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
21da0 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
21db0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21dc0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21dd0 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
21de0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
21df0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21e00 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
21e10 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
21e20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
21e30 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
21e40 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
21e50 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
21e60 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
21e70 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
21e80 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
21e90 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21ea0 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
21eb0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
21ec0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
21ed0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21ee0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21ef0 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
21f00 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
21f10 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
21f20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
21f30 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
21f40 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
21f50 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
21f60 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
21f70 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
21f80 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
21f90 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
21fa0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
21fb0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21fc0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21fd0 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
21fe0 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
21ff0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
22000 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
22010 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
22020 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
22030 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
22040 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
22050 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
22060 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
22070 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
22080 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
22090 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
220a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
220b0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
220c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
220d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
220e0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
220f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22100 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
22110 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
22120 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
22130 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
22140 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
22150 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
22160 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
22170 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
22180 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
22190 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
221a0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
221b0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
221c0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
221d0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
221e0 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
221f0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
22200 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
22210 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
22220 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22230 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
22240 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
22250 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
22260 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22270 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
22280 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
22290 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
222a0 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
222b0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
222c0 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
222d0 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
222e0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
222f0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
22300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22310 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
22320 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
22330 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
22340 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
22350 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
22360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
22370 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22380 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
22390 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
223a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
223b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
223c0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
223d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
223e0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
223f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22400 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22410 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
22420 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
22430 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
22440 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22450 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
22460 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
22470 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
22480 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
22490 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e  to recycle clean
224a0 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65   and unused page
224b0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
224c0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
224d0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
224e0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
224f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22500 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
22510 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22520 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  age);.}../*.** C
22530 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22540 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22550 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22560 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22570 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22580 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73  g to spill pages
22590 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a   to journal..*/.
225a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
225b0 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67  SetSpillsize(Pag
225c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
225d0 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  mxPage){.  retur
225e0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  n sqlite3PcacheS
225f0 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67  etSpillsize(pPag
22600 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22610 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
22620 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
22630 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
22640 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
22650 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
22660 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
22670 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
22680 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22690 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
226a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
226b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
226c0 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
226d0 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
226e0 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
226f0 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
22700 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22710 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
22720 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
22730 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
22740 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
22750 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68     setGetterMeth
22760 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  od(pPager);.    
22770 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
22780 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
22790 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
227a0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
227b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
227c0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
227d0 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
227e0 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70  f any memory map
227f0 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65  ping made of the
22800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
22810 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22820 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
22830 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22840 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
22850 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  Mmap){.  pPager-
22860 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  >szMmap = szMmap
22870 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c  ;.  pagerFixMapl
22880 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  imit(pPager);.}.
22890 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
228a0 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
228b0 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
228c0 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
228d0 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
228e0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
228f0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
22900 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
22910 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
22920 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e  ** Adjust settin
22930 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  gs of the pager 
22940 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
22950 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67  ed in the pgFlag
22960 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  s parameter..**.
22970 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69  ** The "level" i
22980 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  n pgFlags & PAGE
22990 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
229a0 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75  SK sets the robu
229b0 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  stness.** of the
229c0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
229d0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
229e0 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66  ashes or power f
229f0 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68  ailures by.** ch
22a00 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
22a10 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
22a20 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  en writing the j
22a30 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72  ournals..** Ther
22a40 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c  e are four level
22a50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
22a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
22a70 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
22a80 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
22a90 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
22ab0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
22ac0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
22ad0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
22ae0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
22af0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
22b00 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22b10 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22b20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22b30 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
22b40 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
22b50 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
22b70 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
22b80 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
22b90 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
22ba0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22bb0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
22bc0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
22bd0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
22be0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
22bf0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
22c00 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
22c10 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
22c20 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
22c40 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
22c50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
22c60 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
22c70 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
22c80 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
22c90 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
22ca0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22cb0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
22cc0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
22cd0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
22ce0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
22d00 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
22d10 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
22d20 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
22d30 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
22d40 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
22d50 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
22d60 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
22d70 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
22d80 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
22d90 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
22da0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
22db0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22dc0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
22dd0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
22de0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
22df0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
22e00 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
22e10 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
22e20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22e30 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
22e40 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20  .**.**    EXTRA 
22e50 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
22e60 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61   FULL except tha
22e70 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20  t is also syncs 
22e80 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
22ea0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
22eb0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
22ec0 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62   after the rollb
22ed0 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ack.**          
22ee0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75      journal is u
22ef0 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nlinked..**.** T
22f00 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
22f10 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
22f20 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
22f30 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
22f40 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
22f50 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
22f60 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
22f70 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
22f80 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
22f90 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
22fa0 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
22fb0 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
22fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
22fd0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
22fe0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
22ff0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
23000 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
23010 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
23020 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
23030 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
23040 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
23050 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
23060 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
23070 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
23080 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
23090 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
230a0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
230b0 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
230c0 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
230d0 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
230e0 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
230f0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
23100 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23110 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20   NORMAL.  There 
23120 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
23130 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a   between FULL.**
23140 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57   and EXTRA for W
23150 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44  AL mode..**.** D
23160 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
23170 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
23180 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
23190 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
231a0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
231b0 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
231c0 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
231d0 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
231e0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
231f0 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
23200 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
23210 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
23220 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
23230 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
23240 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
23250 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
23260 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
23270 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23280 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
23290 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
232a0 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
232b0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
232c0 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
232d0 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
232e0 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
232f0 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
23300 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
23310 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
23320 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
23330 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
23340 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
23350 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
23360 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
23370 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
23380 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
23390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
233a0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
233b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
233c0 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
233d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
233e0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
233f0 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
23400 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
23410 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
23420 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
23430 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
23440 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
23450 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
23460 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
23470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
23480 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
23490 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
234a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
234b0 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  llSync = 0;.    
234c0 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
234d0 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
234e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
234f0 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47  nc =  level==PAG
23500 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f  ER_SYNCHRONOUS_O
23510 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61  FF ?1:0;.    pPa
23520 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
23530 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e  level>=PAGER_SYN
23540 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31  CHRONOUS_FULL ?1
23550 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  :0;.    pPager->
23560 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65  extraSync = leve
23570 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
23580 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b  NOUS_EXTRA ?1:0;
23590 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
235a0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
235b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
235c0 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  gs = 0;.    pPag
235d0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
235e0 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
235f0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
23600 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
23610 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
23620 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
23630 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
23640 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
23650 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23660 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
23670 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23680 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59  GER_CKPT_FULLFSY
23690 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
236a0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
236b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
236c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
236d0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
236e0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
236f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23700 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23710 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23720 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
23730 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
23740 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23750 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
23760 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23770 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
23780 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
23790 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
237a0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
237b0 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
237c0 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
237d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c  ;.  }.  if( pgFl
237e0 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48  ags & PAGER_CACH
237f0 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50  ESPILL ){.    pP
23800 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
23810 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f   &= ~SPILLFLAG_O
23820 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FF;.  }else{.   
23830 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
23840 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
23850 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  _OFF;.  }.}.#end
23860 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
23870 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
23880 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
23890 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
238a0 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
238b0 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
238c0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
238d0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
238e0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
238f0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
23900 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
23910 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23920 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
23930 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
23940 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
23950 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
23960 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
23970 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23980 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
23990 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
239a0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
239b0 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
239c0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
239d0 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
239e0 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
239f0 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
23a00 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
23a10 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
23a20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
23a30 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
23a40 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
23a50 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
23a60 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
23a70 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
23a80 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
23a90 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
23aa0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
23ab0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23ac0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
23ad0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
23ae0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23af0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
23b00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23b10 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
23b20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
23b30 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
23b40 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
23b50 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
23b60 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
23b70 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
23b80 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
23b90 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
23ba0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
23bb0 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
23bc0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
23bd0 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
23be0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c00 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
23c10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
23c20 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
23c30 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
23c40 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
23c50 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
23c60 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
23c70 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
23c80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23c90 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
23ca0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
23cb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23cc0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
23cd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23ce0 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
23cf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
23d00 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
23d10 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
23d20 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
23d30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
23d40 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
23d50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23d60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
23d70 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
23d80 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
23d90 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
23da0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
23db0 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
23dc0 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
23dd0 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
23de0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
23df0 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
23e00 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
23e10 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
23e20 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
23e30 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
23e40 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
23e50 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
23e60 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
23e70 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
23e80 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
23e90 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
23ea0 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
23eb0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
23ec0 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
23ed0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
23ee0 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
23ef0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
23f00 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
23f10 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
23f20 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
23f30 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
23f40 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
23f50 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
23f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f90 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
23fa0 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
23fb0 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
23fc0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
23fd0 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
23fe0 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
23ff0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
24000 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
24010 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
24020 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
24030 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
24040 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
24050 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
24060 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
24070 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
24080 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
24090 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
240a0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
240b0 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
240c0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
240d0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
240e0 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
240f0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
24100 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
24110 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
24120 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
24150 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
24160 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
24170 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
24180 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
24190 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
241a0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
241b0 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
241c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
241d0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
241e0 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
241f0 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
24200 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
24210 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
24220 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
24230 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
24240 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
24250 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24260 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
24270 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
24280 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
24290 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
242a0 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
242b0 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
242c0 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
242d0 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
242e0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
242f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
24300 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
24310 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
24320 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
24330 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
24340 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24350 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
24360 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
24370 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
24380 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
24390 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
243a0 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
243b0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
243c0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
243d0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
243e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
243f0 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
24400 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
24410 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
24420 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
24430 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
24440 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
24450 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
24460 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
24470 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
24480 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
24490 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
244a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
244b0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
244c0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
244d0 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
244e0 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
244f0 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
24500 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
24510 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
24520 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
24530 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
24540 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
24550 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
24560 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
24570 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
24580 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
24590 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
245a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
245b0 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
245c0 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
245d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
245e0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
245f0 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
24600 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
24610 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
24620 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
24630 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
24640 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
24650 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
24660 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
24670 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
24680 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
24690 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
246a0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
246b0 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
246c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
246d0 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
246e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
246f0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
24700 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
24710 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
24720 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
24730 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
24740 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
24750 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24760 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
24770 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
24780 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
24790 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
247a0 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
247b0 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
247c0 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
247d0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
247e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
247f0 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
24800 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
24810 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
24820 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
24830 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
24840 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
24850 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
24860 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
24870 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
24880 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
24890 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
248a0 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
248b0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
248c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
248d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
248e0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
248f0 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
24900 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
24910 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
24920 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
24930 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
24940 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
24950 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
24960 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
24970 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
24980 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
24990 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
249a0 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
249b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
249c0 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
249d0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
249e0 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
249f0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
24a00 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
24a10 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
24a20 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
24a30 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
24a40 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
24a50 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
24a60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
24a70 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
24a80 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
24a90 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
24aa0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
24ab0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
24ac0 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
24ad0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
24ae0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
24af0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
24b00 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
24b10 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
24b20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
24b30 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
24b40 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
24b50 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24b60 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
24b70 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
24b80 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
24b90 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
24ba0 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
24bb0 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
24bc0 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
24bd0 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
24be0 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
24bf0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
24c00 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
24c10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24c20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
24c30 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
24c40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
24c50 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
24c60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24c70 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
24c80 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
24c90 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
24ca0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
24cb0 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
24cc0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
24cd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
24ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24cf0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
24d00 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
24d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
24d20 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
24d30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
24d40 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
24d50 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
24d60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24d70 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
24d80 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
24d90 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
24da0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
24db0 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65  New;.      pPage
24dc0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
24dd0 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
24de0 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
24df0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
24e00 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
24e10 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
24e20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
24e30 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
24e40 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
24e50 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
24e60 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
24e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24e80 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
24e90 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
24ea0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
24eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
24ec0 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
24ed0 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
24ee0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
24ef0 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
24f00 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
24f10 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
24f20 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c      pagerFixMapl
24f30 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  imit(pPager);.  
24f40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24f50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
24f60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24f70 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
24f80 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
24f90 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
24fa0 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
24fb0 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
24fc0 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
24fd0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
24fe0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
24ff0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
25000 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
25010 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
25020 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
25030 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
25040 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
25050 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
25060 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
25070 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
25080 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
25090 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
250a0 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
250b0 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
250c0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
250d0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
250e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
250f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
25100 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
25110 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
25120 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
25130 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
25140 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
25150 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
25160 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
25170 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
25180 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
25190 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
251a0 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
251b0 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
251c0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
251d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
251e0 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
251f0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
25200 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
25210 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
25220 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
25230 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
25240 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
25250 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
25260 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
25270 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
25280 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
25290 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
252a0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
252b0 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f  R_OPEN );      /
252c0 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79  * Called only by
252d0 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a   OP_MaxPgcnt */.
252e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
252f0 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72  ->mxPgno>=pPager
25300 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20  ->dbSize );  /* 
25310 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f  OP_MaxPgcnt enfo
25320 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72  rces this */.  r
25330 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
25340 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
25350 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
25360 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
25370 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
25380 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
25390 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
253a0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
253b0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
253c0 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
253d0 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
253e0 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
253f0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
25400 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
25410 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
25420 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
25430 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
25440 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
25450 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
25460 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
25470 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
25480 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
25490 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
254a0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
254b0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
254c0 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
254d0 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
254e0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
254f0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25500 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
25510 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25520 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
25530 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25540 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
25550 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25560 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
25570 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
25580 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
25590 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
255a0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
255b0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
255c0 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
255d0 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
255e0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
255f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
25600 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
25610 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
25620 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
25630 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
25640 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
25650 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
25660 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
25670 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
25680 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
25690 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
256a0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
256b0 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
256c0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
256d0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
256e0 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
256f0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25700 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
25710 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
25720 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
25730 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25740 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
25750 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
25760 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
25770 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
25780 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
25790 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
257a0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
257b0 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
257c0 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
257d0 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
257e0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
257f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
25800 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
25810 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
25820 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
25830 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25840 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
25850 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
25860 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25870 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
25880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25890 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
258a0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
258b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
258c0 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
258d0 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
258e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
258f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
25900 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
25910 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
25920 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
25930 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
25940 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
25950 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
25960 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
25970 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
25980 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
25990 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
259a0 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
259b0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
259c0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
259d0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
259e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
259f0 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
25a00 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
25a10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
25a20 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
25a30 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
25a40 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
25a50 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
25a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
25a70 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
25a80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25aa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25ab0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
25ac0 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
25ad0 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
25ae0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
25af0 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
25b00 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
25b10 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
25b20 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
25b30 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
25b40 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
25b50 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
25b60 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
25b70 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
25b80 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
25b90 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
25ba0 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
25bb0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
25bc0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
25bd0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
25be0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
25bf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
25c00 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
25c10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25c20 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
25c30 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
25c40 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
25c50 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
25c60 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
25c70 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
25c80 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
25c90 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
25ca0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
25cb0 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
25cc0 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
25cd0 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
25ce0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
25cf0 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
25d00 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
25d10 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
25d20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
25d30 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
25d40 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
25d50 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
25d60 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
25d70 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
25d80 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
25d90 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
25da0 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
25db0 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
25dc0 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
25dd0 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
25de0 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
25df0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
25e00 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
25e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
25e20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
25e30 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
25e40 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
25e50 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
25e60 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
25e70 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
25e80 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
25e90 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
25ea0 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
25eb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
25ec0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
25ed0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
25ee0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
25ef0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
25f00 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25f30 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
25f40 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
25f50 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
25f60 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
25f70 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
25f80 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
25f90 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66  held), or one of
25fa0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73   the transitions
25fb0 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
25fc0 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
25fd0 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
25fe0 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
25ff0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
26000 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
26010 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
26020 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
26030 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
26040 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
26050 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
26060 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
26070 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
26080 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
26090 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
260a0 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
260b0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
260c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
260d0 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
260e0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
260f0 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
26100 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
26110 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
26120 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
26130 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
26140 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
26150 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26160 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
26170 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26180 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
26190 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
261a0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
261b0 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
261c0 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
261d0 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
261e0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
261f0 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
26200 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
26210 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
26220 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
26230 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
26240 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
26250 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
26260 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
26270 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
26280 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
26290 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
262a0 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
262b0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
262c0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
262d0 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
262e0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
262f0 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
26300 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
26310 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
26320 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
26330 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
26340 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
26350 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
26360 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
26370 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
26380 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
26390 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
263a0 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
263b0 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
263c0 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
263d0 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
263e0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
263f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
26400 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
26410 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
26420 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
26430 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
26440 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
26450 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
26460 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
26470 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
26480 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
26490 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
264a0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
264b0 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
264c0 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
264d0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
264e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
264f0 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
26500 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
26510 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
26520 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
26530 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
26540 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
26550 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
26560 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
26570 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
26580 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
26590 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
265a0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
265b0 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
265c0 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
265d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
265e0 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
265f0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26600 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
26610 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26620 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
26630 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
26640 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
26650 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
26660 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
26670 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
26680 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
26690 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
266a0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
266b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
266c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
266d0 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
266e0 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
266f0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26700 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
26710 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
26720 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26730 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
26740 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
26750 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
26760 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
26770 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
26780 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
26790 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
267a0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
267b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
267c0 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
267d0 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
267e0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
267f0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
26800 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
26810 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
26820 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
26830 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
26840 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
26850 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
26860 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26870 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26880 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26890 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
268a0 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
268b0 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
268c0 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
268d0 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
268e0 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
268f0 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
26900 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
26910 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
26920 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
26930 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
26940 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
26950 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
26960 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
26970 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
26980 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
26990 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
269a0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
269b0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
269c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
269d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
269e0 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
269f0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
26a00 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
26a10 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
26a20 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
26a30 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26a40 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
26a50 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
26a60 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
26a70 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
26a80 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
26a90 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
26aa0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
26ab0 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
26ac0 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
26ad0 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
26ae0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
26af0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
26b00 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
26b10 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
26b20 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
26b30 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
26b40 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
26b50 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
26b60 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26b70 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26b80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
26b90 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
26ba0 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
26bb0 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
26bc0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
26bd0 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
26be0 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
26bf0 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
26c00 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
26c10 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26c20 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
26c30 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
26c40 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
26c50 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
26c60 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26c70 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
26c80 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
26c90 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
26ca0 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
26cb0 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
26cc0 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
26cd0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
26ce0 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
26cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26d00 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
26d10 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
26d20 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
26d30 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
26d40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
26d50 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
26d60 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
26d70 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
26d80 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
26d90 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
26da0 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
26db0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
26dc0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
26dd0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
26de0 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
26df0 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
26e00 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
26e10 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
26e20 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
26e30 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
26e40 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
26e50 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
26e60 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
26e70 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
26e80 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
26e90 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
26ea0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
26eb0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
26ec0 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
26ed0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
26ee0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26ef0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26f00 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
26f10 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
26f20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
26f30 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
26f40 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
26f50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
26f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
26f70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
26f80 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
26f90 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
26fa0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
26fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
26fc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
26fd0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62  _SIZE>0./*.** Ob
26fe0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
26ff0 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
27000 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
27010 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
27020 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
27030 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
27040 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
27050 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
27060 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
27070 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
27080 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
27090 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
270a0 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
270b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
270c0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
270d0 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
270e0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
270f0 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
27100 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
27110 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
27120 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
27130 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
27140 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
27150 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
27160 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
27170 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
27180 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
27190 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
271a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271c0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
271d0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271f0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
27200 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
27210 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
27220 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
27230 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
27240 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
27250 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27270 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
27280 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
27290 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
272c0 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
272d0 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70  rn */.  .  if( p
272e0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
272f0 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50  list ){.    *ppP
27300 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72  age = p = pPager
27310 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27320 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  .    pPager->pMm
27330 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e  apFreelist = p->
27340 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
27350 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61  Dirty = 0;.    a
27360 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27370 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20  Extra>=8 );.    
27380 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61  memset(p->pExtra
27390 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 8);.  }else
273a0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
273b0 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
273c0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
273d0 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
273e0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
273f0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
27400 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
27410 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
27420 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
27430 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
27440 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
27450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27460 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
27470 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
27480 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
27490 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
274a0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
274b0 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
274c0 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
274d0 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
274e0 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
274f0 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
27500 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
27510 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
27520 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
27530 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
27540 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
27550 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
27560 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
27570 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
27580 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
27590 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
275a0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
275b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
275c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
275d0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
275e0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
275f0 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
27600 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
27610 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
27620 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
27630 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
27640 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27650 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
27660 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
27670 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
27680 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27690 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
276a0 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
276b0 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
276c0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
276d0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
276e0 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
276f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27700 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
27710 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
27720 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
27730 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
27740 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
27750 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27760 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
27770 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
27780 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
27790 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
277a0 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
277b0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
277c0 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
277d0 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
277e0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
277f0 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
27800 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
27810 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27820 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
27830 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
27840 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
27850 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
27860 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
27870 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
27880 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
27890 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
278a0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
278b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
278c0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
278d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
278e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
278f0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
27900 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
27910 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
27920 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
27930 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
27940 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
27950 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
27960 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
27970 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
27980 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
27990 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
279a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
279b0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
279c0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
279d0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
279e0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
279f0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
27a00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
27a10 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
27a20 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
27a30 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
27a40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
27a50 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
27a60 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
27a70 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
27a80 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
27a90 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
27aa0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
27ab0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
27ac0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27ad0 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
27ae0 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ger, sqlite3 *db
27af0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
27b00 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
27b10 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
27b20 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55  rt( db || pagerU
27b30 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
27b40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
27b50 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
27b60 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
27b70 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
27b80 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
27b90 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
27ba0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67  nMalloc();.  pag
27bb0 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50  erFreeMapHdrs(pP
27bc0 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ager);.  /* pPag
27bd0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
27be0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   */.  pPager->ex
27bf0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
27c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27c10 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
27c20 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d  t( db || pPager-
27c30 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  >pWal==0 );.  sq
27c40 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
27c50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20  ager->pWal, db, 
27c60 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
27c70 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
27c80 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28  ageSize,.      (
27c90 64 62 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  db && (db->flags
27ca0 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74   & SQLITE_NoCkpt
27cb0 4f 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70  OnClose) ? 0 : p
27cc0 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67  Tmp).  );.  pPag
27cd0 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
27ce0 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
27cf0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
27d00 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
27d10 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
27d20 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
27d30 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
27d40 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
27d50 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
27d60 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
27d70 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
27d80 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
27d90 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
27da0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
27db0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
27dc0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
27dd0 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
27de0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
27df0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
27e00 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
27e10 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
27e20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
27e30 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
27e40 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
27e50 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
27e60 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
27e70 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
27e80 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
27e90 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
27ea0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
27eb0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
27ec0 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
27ed0 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
27ee0 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
27ef0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
27f00 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
27f10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
27f20 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
27f30 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
27f40 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
27f50 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
27f60 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
27f70 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
27f80 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
27f90 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
27fa0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
27fb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
27fc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
27fd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27fe0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
27ff0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
28000 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
28010 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
28020 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
28030 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
28040 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
28050 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
28060 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
28070 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
28080 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
28090 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
280a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
280b0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
280c0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
280d0 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
280e0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
280f0 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
28100 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
28110 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
28120 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
28130 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
28140 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
28150 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
28160 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
28170 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
28180 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
28190 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
281a0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
281b0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
281c0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
281d0 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
281e0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
281f0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
28200 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
28210 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
28220 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
28230 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
28240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28250 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
28260 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
28270 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
28280 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
28290 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
282a0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
282b0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
282c0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
282d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
282e0 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
282f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
28300 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
28310 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
28320 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
28330 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
28340 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
28350 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
28360 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
28370 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
28380 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
28390 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
283a0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
283b0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
283c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
283d0 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
283e0 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
283f0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
28400 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
28410 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
28420 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
28430 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
28440 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
28450 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
28460 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
28470 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28480 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
28490 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
284a0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
284b0 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
284c0 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
284d0 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
284e0 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
284f0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
28500 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
28510 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
28520 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
28530 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
28540 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
28550 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
28560 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
28570 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
28580 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
28590 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
285a0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
285b0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
285c0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
285d0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
285e0 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
285f0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
28600 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
28610 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
28620 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
28630 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
28640 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
28650 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
28660 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
28670 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
28680 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
28690 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
286a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
286b0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
286c0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
286d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
286e0 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
286f0 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
28700 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
28710 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
28720 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
28730 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
28740 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
28750 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
28760 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
28770 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
28780 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
28790 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
287a0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
287b0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
287c0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
287d0 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
287e0 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
287f0 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
28800 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
28810 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
28820 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
28830 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
28840 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
28850 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
28860 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
28870 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
28880 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
28890 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
288a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
288b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
288c0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
288d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
288e0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
288f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
28900 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
28910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
28920 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
28930 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
28940 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28970 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
28980 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
28990 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
289a0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
289b0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
289c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
289d0 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
289e0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
289f0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
28a00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
28a10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
28a20 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
28a30 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
28a40 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
28a50 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28a60 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28a70 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
28a80 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
28a90 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
28aa0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
28ab0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
28ac0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
28ad0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
28ae0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
28af0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
28b00 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
28b10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
28b20 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
28b30 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
28b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
28b50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
28b60 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
28b70 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28b80 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
28b90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
28ba0 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
28bb0 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
28bc0 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
28bd0 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
28be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
28bf0 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
28c00 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
28c10 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
28c20 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
28c30 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
28c40 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
28c50 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
28c60 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
28c70 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
28c80 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
28c90 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
28ca0 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
28cb0 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
28cc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
28cd0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
28ce0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
28cf0 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
28d00 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
28d10 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
28d20 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
28d30 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
28d40 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
28d50 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
28d60 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
28d70 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
28d80 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
28d90 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
28da0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
28db0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
28dc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
28dd0 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
28de0 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
28df0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
28e00 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
28e10 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
28e20 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
28e30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
28e40 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
28e50 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
28e60 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
28e70 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
28e80 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
28e90 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
28ea0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
28eb0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
28ec0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
28ed0 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
28ee0 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
28ef0 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
28f00 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
28f10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
28f20 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
28f30 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
28f40 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
28f50 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
28f60 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
28f70 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
28f80 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
28f90 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
28fa0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
28fb0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
28fc0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
28fd0 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
28fe0 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
28ff0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29000 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
29010 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
29020 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
29030 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
29040 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
29050 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
29060 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
29070 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
29080 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
29090 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
290a0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
290b0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
290c0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
290d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
290e0 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
290f0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
29100 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
29110 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
29120 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
29130 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
29140 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
29150 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
29160 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
29170 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
29180 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
29190 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
291a0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
291b0 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
291c0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
291d0 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
291e0 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
291f0 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
29200 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
29210 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
29220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
29230 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
29240 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
29250 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
29260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29270 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
29280 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
29290 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
292a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
292b0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
292c0 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
292d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
292e0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
292f0 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
29300 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
29310 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29320 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29330 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
29340 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
29350 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
29360 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29370 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
29380 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
29390 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
293a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
293b0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
293c0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
293d0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
293e0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
293f0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
29400 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
29410 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
29420 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
29430 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
29440 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
29450 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
29460 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
29470 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
29480 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
29490 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
294a0 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
294b0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
294c0 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
294d0 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
294e0 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
294f0 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
29500 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
29510 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
29520 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
29530 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
29540 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
29550 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
29560 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
29570 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
29580 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
29590 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
295a0 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
295b0 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
295c0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
295d0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
295e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
295f0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
29600 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
29610 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
29620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
29630 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
29640 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
29650 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
29660 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
29670 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
29680 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
29690 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
296a0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
296b0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
296c0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
296d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
296e0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
296f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
29700 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
29710 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
29720 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
29730 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
29740 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
29750 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
29760 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
29770 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
29780 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
29790 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
297a0 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
297b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
297c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
297d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
297e0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
297f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
29800 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
29810 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29820 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
29830 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29840 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
29850 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
29860 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
29870 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
29880 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
29890 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
298a0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
298b0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
298c0 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
298d0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
298e0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
298f0 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
29900 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
29920 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
29930 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
29940 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
29950 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
29960 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
29970 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
29980 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
29990 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
299a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
299b0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
299c0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
299d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
299e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
299f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29a00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29a10 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
29a20 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
29a30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
29a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29a50 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
29a60 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
29a70 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
29a80 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
29a90 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
29aa0 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
29ab0 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
29ac0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
29ad0 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
29ae0 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
29af0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
29b00 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
29b10 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
29b20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
29b30 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
29b40 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
29b50 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
29b60 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
29b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
29b90 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
29ba0 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
29bb0 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
29bc0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
29bd0 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
29be0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
29bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
29c00 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
29c10 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
29c20 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
29c30 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
29c40 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
29c50 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
29c60 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
29c70 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
29c80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
29c90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
29ca0 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
29cb0 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
29cc0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
29cd0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
29ce0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
29cf0 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
29d00 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
29d10 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
29d20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
29d30 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
29d40 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
29d50 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
29d60 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
29d70 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
29d80 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
29d90 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
29da0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
29db0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29dc0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
29dd0 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
29de0 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
29df0 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
29e00 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
29e10 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
29e20 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
29e30 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
29e40 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
29e50 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
29e60 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
29e70 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
29e80 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
29e90 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
29ea0 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
29eb0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
29ec0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
29ed0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
29ee0 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
29ef0 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
29f00 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
29f10 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
29f20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
29f30 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
29f40 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
29f50 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
29f60 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
29f70 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
29f80 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
29f90 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
29fa0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
29fb0 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
29fc0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
29fd0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
29fe0 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
29ff0 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
2a000 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
2a010 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
2a020 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
2a030 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
2a040 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
2a050 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
2a060 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
2a070 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
2a080 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
2a090 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2a0a0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
2a0b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2a0c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2a0d0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2a0e0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
2a0f0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2a100 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
2a110 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
2a120 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
2a130 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
2a140 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2a150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2a160 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
2a170 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
2a180 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
2a190 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
2a1a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a1c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2a1d0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a1e0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
2a1f0 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
2a200 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
2a210 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
2a220 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
2a230 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2a240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a250 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
2a260 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2a270 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
2a280 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
2a290 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
2a2a0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
2a2b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2a2c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2a2d0 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  || pList->pDirty
2a2e0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
2a2f0 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
2a300 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
2a310 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
2a320 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
2a330 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
2a340 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
2a350 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
2a360 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
2a370 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
2a380 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
2a390 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
2a3a0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
2a3b0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
2a3c0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2a3d0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
2a3e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
2a3f0 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
2a400 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2a410 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
2a420 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
2a430 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
2a440 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
2a450 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
2a460 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
2a470 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
2a480 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
2a490 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
2a4a0 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
2a4b0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2a4c0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2a4d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2a4e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a4f0 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65  _OK .   && pPage
2a500 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50  r->dbHintSize<pP
2a510 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20  ager->dbSize.   
2a520 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74  && (pList->pDirt
2a530 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  y || pList->pgno
2a540 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
2a550 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ize).  ){.    sq
2a560 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
2a570 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
2a580 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
2a590 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
2a5a0 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
2a5b0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
2a5c0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
2a5d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
2a5e0 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
2a5f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
2a600 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
2a610 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
2a620 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2a630 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
2a640 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2a650 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
2a660 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2a670 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
2a680 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
2a690 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
2a6a0 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
2a6b0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
2a6c0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
2a6d0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
2a6e0 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
2a6f0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
2a700 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
2a710 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
2a720 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
2a730 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
2a740 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
2a750 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
2a760 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
2a770 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
2a780 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
2a790 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
2a7a0 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
2a7b0 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
2a7c0 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
2a7d0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
2a7e0 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
2a7f0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
2a800 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
2a810 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
2a820 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
2a830 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
2a840 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
2a850 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
2a860 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
2a870 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
2a880 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2a890 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
2a8c0 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
2a8d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
2a8e0 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
2a8f0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2a900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2a910 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
2a920 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
2a930 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
2a940 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
2a950 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2a960 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2a970 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
2a980 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
2a990 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2a9a0 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20  BKPT, pData);.. 
2a9b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
2a9c0 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
2a9d0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2a9e0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2a9f0 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
2aa00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2aa10 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
2aa20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
2aa30 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
2aa40 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
2aa50 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
2aa60 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
2aa70 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
2aa80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2aa90 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
2aaa0 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
2aab0 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
2aac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2aad0 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
2aae0 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
2aaf0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2ab00 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
2ab10 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2ab20 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
2ab30 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
2ab40 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
2ab50 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
2ab60 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
2ab70 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2ab80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
2ab90 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
2aba0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20   pgno;.      }. 
2abb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
2abc0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
2abd0 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  ITE]++;..      /
2abe0 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
2abf0 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
2ac00 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
2ac10 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
2ac20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2ac30 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
2ac40 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
2ac50 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
2ac60 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
2ac70 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
2ac80 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
2ac90 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2acb0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2acc0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
2acd0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
2ace0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
2acf0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
2ad00 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
2ad10 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
2ad20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2ad30 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
2ad40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
2ad50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
2ad60 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
2ad70 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2ad80 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
2ad90 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
2ada0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
2adb0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
2adc0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
2add0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ade0 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
2adf0 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
2ae00 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
2ae10 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
2ae20 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
2ae30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2ae40 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
2ae50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2ae60 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
2ae70 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
2ae80 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
2ae90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
2aea0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2aeb0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
2aec0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
2aed0 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
2aee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2aef0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
2af00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2af10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2af20 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
2af30 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
2af40 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
2af50 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f  lags =  SQLITE_O
2af60 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
2af70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2af80 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20  DWRITE .      | 
2af90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2afa0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
2afb0 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20  _EXCLUSIVE .    
2afc0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2afd0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
2afe0 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c     int nStmtSpil
2aff0 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  l = sqlite3Confi
2b000 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20  g.nStmtSpill;.  
2b010 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b020 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2b030 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b040 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
2b050 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2b060 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20       nStmtSpill 
2b070 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2b080 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2b090 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
2b0a0 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d  pVfs, 0, pPager-
2b0b0 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53  >sjfd, flags, nS
2b0c0 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20  tmtSpill);.  }. 
2b0d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b0e0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
2b0f0 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
2b100 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
2b110 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
2b120 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a  -journal. .**.**
2b130 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2b140 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
2b150 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
2b160 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
2b170 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
2b180 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
2b190 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2b1a0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
2b1b0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2b1c0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
2b1d0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2b1e0 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
2b1f0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
2b200 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
2b210 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
2b220 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
2b230 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
2b240 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
2b250 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
2b260 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
2b270 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
2b280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2b290 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
2b2a0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
2b2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b2c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2b2d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2b2e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2b2f0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2b300 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2b310 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
2b320 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2b330 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
2b340 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
2b350 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
2b360 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2b370 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
2b380 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2b390 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
2b3a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b3b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2b3c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2b3d0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
2b3e0 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
2b3f0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
2b400 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
2b410 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
2b420 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70  ournal(pPager, p
2b430 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
2b440 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
2b450 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2b460 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
2b470 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
2b480 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
2b490 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2b4a0 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
2b4b0 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
2b4c0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
2b4d0 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
2b4e0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
2b4f0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2b500 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b520 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
2b530 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
2b540 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2b550 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
2b560 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
2b570 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2b580 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
2b590 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
2b5a0 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20 69 66  ODEC   .      if
2b5b0 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  ( !pPager->subjI
2b5c0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2b5d0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2b5e0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
2b5f0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
2b600 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
2b610 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2b620 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2b630 20 20 20 70 44 61 74 61 32 20 3d 20 70 44 61 74     pData2 = pDat
2b640 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  a;.      PAGERTR
2b650 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
2b660 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
2b670 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b680 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2b690 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2b6a0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
2b6b0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
2b6c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2b6d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b6f0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2b700 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
2b710 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2b720 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
2b730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2b740 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2b750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b760 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
2b770 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
2b780 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2b790 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
2b7a0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2b7b0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2b7c0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
2b7d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2b7e0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2b7f0 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2b800 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2b810 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2b820 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2b830 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e   return subjourn
2b840 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  alPage(pPg);.  }
2b850 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2b860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2b870 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2b880 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2b890 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
2b8a0 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
2b8b0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
2b8c0 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
2b8d0 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
2b8e0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
2b8f0 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
2b900 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
2b910 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
2b920 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
2b930 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
2b940 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
2b950 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
2b960 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2b970 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
2b980 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
2b990 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
2b9a0 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
2b9b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2b9c0 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
2b9d0 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
2b9e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2b9f0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
2ba00 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
2ba10 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
2ba20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
2ba30 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2ba40 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
2ba50 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
2ba60 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
2ba70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2ba80 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
2ba90 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
2baa0 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
2bab0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2bac0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
2bad0 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
2bae0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2baf0 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
2bb00 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
2bb10 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2bb20 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2bb30 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2bb40 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
2bb50 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
2bb60 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
2bb70 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2bb80 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
2bb90 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
2bba0 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
2bbb0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
2bbc0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2bbd0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2bbe0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
2bbf0 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
2bc00 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
2bc10 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
2bc20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
2bc30 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
2bc40 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2bc50 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
2bc60 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
2bc70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2bc80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2bc90 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2bca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2bcb0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2bcc0 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
2bcd0 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43  oNotSpill NOSYNC
2bce0 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69   bit is set duri
2bcf0 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2bd00 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2bd10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2bd20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2bd30 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2bd40 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2bd50 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2bd60 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2bd70 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2bd80 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2bd90 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2bda0 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2bdb0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2bdc0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2bdd0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f  he doNotSpill RO
2bde0 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62  LLBACK and OFF b
2bdf0 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  its inhibits all
2be00 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a   cache spilling.
2be10 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
2be20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2be30 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
2be40 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
2be50 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61  et during.  ** a
2be60 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20   rollback or by 
2be70 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65  user request, re
2be80 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a  spectively..  **
2be90 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
2bea0 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
2beb0 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
2bec0 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
2bed0 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
2bee0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
2bef0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
2bf00 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
2bf10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a  lementation it .
2bf20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62    ** is impossib
2bf30 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63  le for sqlite3Pc
2bf40 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62  acheFetch() to b
2bf50 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72  e called with cr
2bf60 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a  eateFlag==3.  **
2bf70 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72   while in the er
2bf80 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65  ror state, hence
2bf90 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
2bfa0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
2bfb0 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61  ne to.  ** be ca
2bfc0 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f  lled in the erro
2bfd0 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74  r state.  Nevert
2bfe0 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75  heless, we inclu
2bff0 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a  de a NEVER().  *
2c000 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65  * test for the e
2c010 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20  rror state as a 
2c020 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73  safeguard agains
2c030 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
2c040 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2c050 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2c060 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
2c070 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61  ITE_OK;.  testca
2c080 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2c090 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2c0a0 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  AG_ROLLBACK );. 
2c0b0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2c0c0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2c0d0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b  SPILLFLAG_OFF );
2c0e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2c0f0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2c100 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59  & SPILLFLAG_NOSY
2c110 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  NC );.  if( pPag
2c120 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20  er->doNotSpill. 
2c130 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64    && ((pPager->d
2c140 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49  oNotSpill & (SPI
2c150 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c  LLFLAG_ROLLBACK|
2c160 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21  SPILLFLAG_OFF))!
2c170 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  =0.      || (pPg
2c180 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2c190 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20  NEED_SYNC)!=0). 
2c1a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2c1c0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
2c1d0 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
2c1e0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
2c1f0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
2c200 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
2c210 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
2c220 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
2c230 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
2c240 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20  fRequired(pPg); 
2c250 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c270 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
2c280 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
2c290 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2c2a0 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
2c2b0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2c2c0 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
2c2d0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2c2e0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c2f0 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20  NEED_SYNC .     
2c300 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2c310 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2c320 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a  CACHEMOD.    ){.
2c330 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
2c340 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31  ournal(pPager, 1
2c350 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2c360 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
2c370 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2c380 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
2c390 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2c3a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c3b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2c3c0 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
2c3d0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2c3e0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
2c3f0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
2c400 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
2c410 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
2c420 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2c430 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
2c440 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2c450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
2c460 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
2c470 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2c480 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2c490 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2c4a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2c4b0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
2c4c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
2c4d0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2c4e0 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc); .}../*.** 
2c4f0 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65  Flush all unrefe
2c500 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61 67  renced dirty pag
2c510 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  es to disk..*/.i
2c520 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  nt sqlite3PagerF
2c530 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61 67  lush(Pager *pPag
2c540 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2c550 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2c560 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
2c570 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73  .    PgHdr *pLis
2c580 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
2c590 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2c5a0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
2c5b0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2c5c0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2c5d0 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  er) );.    while
2c5e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c5f0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
2c600 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
2c610 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2c620 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2c630 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
2c640 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 74      rc = pagerSt
2c650 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67  ress((void*)pPag
2c660 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  er, pList);.    
2c670 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20    }.      pList 
2c680 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  = pNext;.    }. 
2c690 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2c6a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2c6b0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
2c6c0 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
2c6d0 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
2c6e0 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
2c6f0 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
2c700 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
2c710 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
2c720 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
2c730 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2c740 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
2c750 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
2c760 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
2c770 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
2c780 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2c790 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
2c7a0 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
2c7b0 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
2c7c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2c7d0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
2c7e0 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
2c7f0 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
2c800 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
2c810 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
2c820 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
2c830 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
2c840 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
2c850 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
2c860 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
2c870 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
2c880 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
2c890 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2c8a0 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
2c8b0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
2c8c0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
2c8d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2c8e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
2c8f0 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
2c900 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
2c910 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2c920 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
2c930 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
2c940 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2c950 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
2c960 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
2c970 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
2c980 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
2c990 78 74 72 61 28 29 20 41 50 49 2e 20 20 57 68 65  xtra() API.  Whe
2c9a0 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69 73 20  n a new page is 
2c9b0 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a 2a  allocated, the.*
2c9c0 2a 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  * first 8 bytes 
2c9d0 6f 66 20 74 68 69 73 20 73 70 61 63 65 20 61 72  of this space ar
2c9e0 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74 68 65  e zeroed but the
2c9f0 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20 75 6e   remainder is un
2ca00 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20  initialized..** 
2ca10 28 54 68 65 20 65 78 74 72 61 20 73 70 61 63 65  (The extra space
2ca20 20 69 73 20 75 73 65 64 20 62 79 20 62 74 72 65   is used by btre
2ca30 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61 67 65  e as the MemPage
2ca40 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20   object.).**.** 
2ca50 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2ca60 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2ca70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2ca80 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2ca90 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2caa0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2cab0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2cac0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2cad0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2cae0 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2caf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2cb00 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2cb10 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2cb20 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2cb30 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2cb40 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2cb50 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2cb60 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2cb70 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2cb80 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2cb90 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2cba0 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2cbb0 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2cbc0 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2cbd0 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2cbe0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2cbf0 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2cc00 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2cc10 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2cc20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2cc30 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2cc40 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2cc50 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2cc60 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2cc70 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2cc80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2cc90 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2cca0 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2ccb0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2ccc0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2ccd0 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2cce0 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2ccf0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2cd00 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2cd10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2cd20 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2cd30 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2cd40 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2cd50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2cd60 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2cd70 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2cd80 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2cd90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2cda0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2cdb0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2cdc0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2cdd0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2cde0 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2cdf0 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2ce00 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2ce10 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2ce20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2ce40 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2ce50 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2ce60 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2ce70 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2ce80 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2ce90 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2cea0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2ceb0 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2cec0 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2ced0 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2cee0 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2cef0 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2cf00 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2cf10 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2cf20 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2cf30 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2cf40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2cf50 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2cf60 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2cf70 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2cf80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2cf90 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2cfa0 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2cfb0 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2cfc0 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2cfd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2cfe0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2cff0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2d000 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2d010 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d020 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2d030 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2d040 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2d050 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2d060 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2d070 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2d080 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2d090 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2d0a0 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2d0b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2d0c0 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2d0d0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2d0e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2d0f0 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2d100 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2d110 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2d120 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2d130 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2d140 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2d150 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2d160 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2d170 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2d180 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2d190 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2d1a0 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2d1b0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2d1c0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2d1d0 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2d1e0 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2d1f0 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2d200 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2d210 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2d220 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2d230 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d240 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2d250 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2d260 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2d270 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2d280 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2d290 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2d2a0 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2d2b0 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2d2c0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2d2d0 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2d2e0 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20  -journal).  */. 
2d2f0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d300 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2d310 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2d320 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  s));..  /* Set t
2d330 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2d340 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2d350 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2d360 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2d370 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2d380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2d390 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2d3a0 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2d3b0 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2d3c0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2d3d0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2d3e0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2d3f0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2d400 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2d410 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2d420 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2d430 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2d440 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2d450 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2d460 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2d470 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2d480 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2d490 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2d4a0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2d4b0 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2d4c0 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2d4d0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2d4e0 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2d4f0 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2d500 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2d510 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2d520 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2d530 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2d540 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2d550 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2d560 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2d570 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d580 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d590 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2d5a0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2d5b0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2d5c0 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2d5d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2d5e0 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2d5f0 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2d600 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2d610 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d620 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d630 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2d640 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2d650 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2d660 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2d670 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2d680 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2d690 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2d6a0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2d6b0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2d6c0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2d6d0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d6e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2d6f0 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2d700 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2d710 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2d720 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2d730 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2d740 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2d750 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2d760 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2d770 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2d780 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2d790 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2d7a0 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2d7b0 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2d7c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d7d0 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2d7e0 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2d7f0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2d800 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2d810 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2d820 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2d830 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2d840 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2d850 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2d860 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2d870 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2d880 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2d890 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2d8a0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2d8b0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2d8c0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2d8d0 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2d8e0 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2d8f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d900 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2d910 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2d920 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2d930 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2d940 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2d950 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2d960 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2d970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d980 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2d990 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d9a0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2d9b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2d9c0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2d9d0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2d9e0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2d9f0 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2da00 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2da10 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2da20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2da30 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2da40 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2da50 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2da60 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2da70 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2da80 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2da90 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2daa0 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2dab0 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2dac0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2dad0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2dae0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2daf0 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2db00 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2db10 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2db20 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2db30 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2db40 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2db50 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2db60 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2db70 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2db80 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2db90 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2dba0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2dbb0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2dbc0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2dbd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2dbe0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2dbf0 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2dc00 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2dc10 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2dc30 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2dc40 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2dc50 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2dc60 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2dc70 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2dc80 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2dc90 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2dca0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2dcb0 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2dcc0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2dcd0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2dce0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2dcf0 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2dd00 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2dd10 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2dd20 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2dd30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2dd40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2dd50 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2dd60 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2dd70 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2dd80 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2dd90 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2dda0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2ddb0 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2ddc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2ddd0 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2dde0 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2ddf0 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2de00 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2de10 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2de20 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2de30 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2de40 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2de50 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2de60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2de70 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2de80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2de90 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2dea0 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2deb0 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2dec0 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2ded0 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2dee0 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2def0 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2df00 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2df10 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2df20 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2df30 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2df40 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2df50 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2df60 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2df70 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2df80 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2df90 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2dfa0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2dfb0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2dfc0 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2dfd0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2dfe0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2dff0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2e000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2e010 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2e020 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2e030 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2e040 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2e050 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2e060 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2e070 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2e080 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2e090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2e0a0 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2e0b0 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2e0c0 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2e0d0 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2e0e0 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2e0f0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2e100 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2e110 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2e120 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2e130 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2e140 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2e150 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2e160 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2e170 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2e180 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2e190 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2e1a0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2e1b0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2e1c0 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2e1d0 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71  0", 8+2);.    sq
2e1e0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2e1f0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2e200 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2e210 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2e220 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2e230 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2e240 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2e250 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2e260 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2e270 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2e280 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2e290 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2e2a0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2e2b0 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2e2c0 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2e2d0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2e2e0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2e2f0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2e300 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2e310 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2e320 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2e330 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2e340 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2e350 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2e360 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2e370 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2e380 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2e390 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2e3a0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2e3b0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e3d0 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2e3e0 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2e3f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2e400 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2e410 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e420 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2e430 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2e440 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2e450 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2e460 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2e470 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2e480 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2e490 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2e4a0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2e4b0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2e4c0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2e4d0 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2e4e0 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2e4f0 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2e500 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2e510 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2e520 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2e530 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2e540 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2e550 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2e560 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2e570 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2e580 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2e590 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2e5a0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2e5b0 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2e5c0 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2e5d0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2e5e0 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2e5f0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2e600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e610 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2e620 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2e630 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2e640 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  ->fd);.      if(
2e650 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
2e660 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2e670 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2e680 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2e690 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2e6a0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2e6b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e6c0 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ZE);.        if(
2e6d0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2e6e0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2e6f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2e700 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2e710 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2e720 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2e730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2e740 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2e750 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2e760 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2e770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e780 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e790 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2e7a0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2e7b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e7c0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2e7d0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2e7e0 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
2e7f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
2e800 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2e810 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2e820 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2e830 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2e840 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2e850 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2e860 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2e870 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2e880 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2e890 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2e8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2e8b0 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
2e8c0 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
2e8d0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2e8e0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
2e8f0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2e900 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2e910 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
2e930 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2e940 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e960 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2e970 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2e980 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  noLock = sqlite3
2e990 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2e9a0 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22  lename, "nolock"
2e9b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2e9c0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
2e9d0 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d  CAP_IMMUTABLE)!=
2e9e0 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
2e9f0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2ea00 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75  zFilename, "immu
2ea10 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20  table", 0) ){.  
2ea20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
2ea30 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2ea40 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2ea50 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b      goto act_lik
2ea60 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20  e_temp_file;.   
2ea70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2ea80 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2ea90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2eaa0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2eab0 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2eac0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2ead0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2eae0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2eaf0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2eb00 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2eb10 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2eb20 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2eb30 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2eb40 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2eb50 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2eb60 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2eb70 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2eb80 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2eb90 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2eba0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2ebb0 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2ebc0 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2ebd0 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2ebe0 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2ebf0 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2ec00 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2ec10 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  urnal..    **.  
2ec20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2ec30 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66   also runs for f
2ec40 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69  iles marked as i
2ec50 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  mmutable..    */
2ec60 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f   .act_like_temp_
2ec70 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69  file:.    tempFi
2ec80 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2ec90 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2eca0 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f  ER_READER;     /
2ecb0 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72  * Pretend we alr
2ecc0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
2ecd0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2ece0 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2ecf0 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72  E_LOCK;    /* Pr
2ed00 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20  etend we are in 
2ed10 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a  EXCLUSIVE mode *
2ed20 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  /.    pPager->no
2ed30 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Lock = 1;       
2ed40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2ed50 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  o locking */.   
2ed60 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2ed70 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2ed80 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2ed90 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2eda0 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2edb0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2edc0 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2edd0 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2ede0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2edf0 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2ee00 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2ee10 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2ee20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ee30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2ee40 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2ee50 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2ee60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2ee70 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2ee80 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2ee90 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2eea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eeb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2eec0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2eed0 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69  e object. */.  i
2eee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2eef0 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d   ){.    nExtra =
2ef00 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2ef10 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78  .    assert( nEx
2ef20 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61  tra>=8 && nExtra
2ef30 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20  <1000 );.    rc 
2ef40 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f  = sqlite3PcacheO
2ef50 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
2ef60 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef80 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
2ef90 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
2efa0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
2efb0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2efc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
2efd0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62  rror occurred ab
2efe0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50  ove, free the  P
2eff0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2f000 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2f010 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2f020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f030 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2f040 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2f050 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
2f060 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
2f070 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  pace);.    sqlit
2f080 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
2f090 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2f0a0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2f0b0 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
2f0c0 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
2f0d0 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
2f0e0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2f0f0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
2f100 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
2f110 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
2f120 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
2f130 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
2f140 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
2f150 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2f160 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
2f170 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2f180 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
2f190 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
2f1a0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f1b0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
2f1c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f1d0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
2f1e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f1f0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
2f200 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
2f210 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
2f220 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
2f230 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2f240 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
2f250 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2f260 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2f270 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f280 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2f290 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2f2a0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2f2b0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2f2c0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2f2d0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2f2e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2f2f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2f300 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2f310 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2f320 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2f330 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2f340 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2f350 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2f360 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2f370 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2f380 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2f390 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2f3a0 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2f3b0 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2f3c0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2f3d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f3e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2f3f0 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2f400 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
2f410 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2f420 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f430 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20  er->fullSync==0 
2f440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f450 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
2f460 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2f470 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  t( pPager->syncF
2f480 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2f490 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77  ssert( pPager->w
2f4a0 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  alSyncFlags==0 )
2f4b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f4c0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2f4d0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ags==0 );.  }els
2f4e0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  e{.    pPager->f
2f4f0 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  ullSync = 1;.   
2f500 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
2f510 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
2f520 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2f530 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2f540 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
2f550 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  walSyncFlags = S
2f560 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2f570 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41  L | WAL_SYNC_TRA
2f580 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70  NSACTIONS;.    p
2f590 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2f5a0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2f5b0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
2f5c0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2f5d0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
2f5e0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
2f5f0 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
2f600 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
2f610 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2f620 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
2f630 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
2f640 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
2f650 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
2f660 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
2f670 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
2f680 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2f690 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
2f6a0 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
2f6b0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
2f6c0 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29  f( !useJournal )
2f6d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2f6e0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2f6f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2f700 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  F;.  }else if( m
2f710 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
2f720 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2f730 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2f740 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
2f750 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
2f760 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
2f770 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2f780 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
2f790 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2f7a0 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
2f7b0 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65  init;.  setGette
2f7c0 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
2f7d0 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2f7e0 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2f7f0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2f800 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
2f810 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
2f820 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
2f830 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
2f840 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
2f850 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
2f860 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2f870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f880 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
2f890 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2f8a0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20  file has not be 
2f8b0 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d  deleted or renam
2f8c0 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75  ed out from.** u
2f8d0 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20  nder the pager. 
2f8e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2f8f0 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  K if the databas
2f900 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20  e is still were 
2f910 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
2f920 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
2f930 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
2f940 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2f950 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
2f960 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
2f970 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
2f980 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
2f990 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
2f9a0 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
2f9b0 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
2f9c0 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
2f9d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2f9e0 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
2f9f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2fa00 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2fa10 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2fa20 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2fa30 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2fa40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fa50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2fa60 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2fa70 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2fa80 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
2fa90 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2faa0 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
2fab0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
2fac0 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
2fad0 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
2fae0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
2faf0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2fb00 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
2fb10 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
2fb20 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
2fb30 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
2fb40 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
2fb50 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
2fb60 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
2fb70 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
2fb80 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
2fb90 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
2fba0 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
2fbb0 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
2fbc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2fbd0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2fbe0 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
2fbf0 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
2fc00 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2fc10 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
2fc20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2fc30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fc40 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2fc50 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2fc60 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2fc70 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2fc80 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2fc90 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2fca0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2fcb0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2fcc0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2fcd0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2fce0 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2fcf0 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2fd00 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2fd10 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2fd20 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2fd30 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2fd40 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2fd50 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2fd60 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2fd70 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2fd80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fd90 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2fda0 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2fdb0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2fdc0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2fdd0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2fde0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2fdf0 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2fe00 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2fe10 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2fe20 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2fe30 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2fe40 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2fe50 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2fe60 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2fe70 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2fe80 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2fe90 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2fea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2feb0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2fec0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2fed0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2fee0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2fef0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2ff00 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2ff10 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2ff20 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2ff30 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2ff40 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2ff50 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2ff60 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2ff70 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2ff80 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2ff90 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2ffa0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ffb0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2ffc0 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2ffd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2ffe0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2fff0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
30000 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
30010 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
30020 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
30030 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
30040 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
30050 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
30060 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
30070 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
30080 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
30090 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
300a0 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
300b0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
300c0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
300d0 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
300e0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
300f0 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
30100 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
30110 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
30120 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
30130 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
30140 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
30150 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
30160 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
30170 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
30180 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30190 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
301a0 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
301b0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
301c0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
301d0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
301e0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
301f0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
30200 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
30210 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
30220 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
30230 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
30240 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
30250 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
30260 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
30270 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
30280 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
30290 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
302a0 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
302b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
302c0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
302d0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
302e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
302f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30300 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
30310 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
30320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30330 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
30340 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
30350 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
30360 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
30370 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
30380 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
30390 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
303a0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
303b0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
303c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
303d0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
303e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
303f0 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
30400 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
30410 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
30420 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
30430 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
30440 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
30450 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
30460 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
30470 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
30480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30490 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
304a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
304b0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
304c0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
304d0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
304e0 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
304f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
30500 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
30510 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
30520 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
30530 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
30540 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
30550 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
30560 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
30570 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
30580 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
30590 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
305a0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
305b0 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
305c0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
305d0 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
305e0 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
305f0 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
30600 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
30610 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
30620 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
30630 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
30640 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
30650 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
30660 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
30670 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
30680 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
30690 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
306a0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
306b0 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
306c0 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
306d0 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
306e0 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
306f0 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
30700 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
30710 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
30720 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
30730 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
30740 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
30750 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
30760 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
30770 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
30780 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30790 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
307a0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
307b0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
307c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
307d0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
307e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
307f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30800 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
30810 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
30820 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
30830 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
30840 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30860 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
30870 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73  se is zero pages
30880 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d   in size, that m
30890 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
308a0 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20   (1) the.       
308b0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61   ** journal is a
308c0 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20   remnant from a 
308d0 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77  prior database w
308e0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
308f0 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20  e where.        
30900 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
30910 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65  file but not the
30920 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c   journal was del
30930 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65  eted, or (2) the
30940 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20   initial.       
30950 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
30960 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61  that populates a
30970 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
30980 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
30990 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
309a0 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
309b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
309c0 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20  can be deleted. 
309d0 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63   However, take c
309e0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  are.        ** n
309f0 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ot to delete the
30a00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
30a10 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
30a20 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20  pen due to.     
30a30 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f     ** journal_mo
30a40 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20  de=PERSIST..    
30a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
30a60 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21  f( nPage==0 && !
30a70 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
30a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
30a90 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
30aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30ab0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
30ac0 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
30ad0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
30ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
30af0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
30b00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
30b10 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
30b20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
30b30 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
30b40 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  ) pagerUnlockDb(
30b50 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
30b60 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
30b70 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
30b80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
30b90 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
30ba0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
30bb0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
30bc0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
30bd0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
30be0 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
30bf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
30c00 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
30c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30c20 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
30c30 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
30c40 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
30c50 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
30c60 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
30c70 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
30c80 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
30c90 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
30ca0 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
30cb0 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
30cc0 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
30cd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
30ce0 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
30cf0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
30d00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
30d10 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30d20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
30d30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
30d40 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
30d50 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
30d60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30d70 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
30d80 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
30d90 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
30da0 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
30db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30dc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30dd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30de0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
30df0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30e00 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
30e10 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
30e20 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
30e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
30e50 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
30e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
30e70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30e80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30e90 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
30ea0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
30eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30ec0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
30ed0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
30ee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
30ef0 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
30f00 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
30f10 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
30f20 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
30f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30f40 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
30f50 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
30f60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
30f70 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
30f80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
30f90 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
30fa0 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
30fb0 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
30fc0 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
30fd0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
30fe0 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
30ff0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
31000 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
31010 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
31020 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
31030 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
31040 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
31050 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
31060 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
31070 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
31080 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
31090 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
310a0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
310b0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
310c0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
310d0 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
310e0 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
310f0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
31100 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
31110 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
31120 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
31130 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
31140 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
31150 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
31160 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
31170 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31180 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
31190 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
311a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
311b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
311c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
311d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
311e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
311f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31200 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
31210 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
31220 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31230 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
31240 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
31250 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
31260 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
31270 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
31280 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
31290 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
312a0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
312b0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
312c0 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
312d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
312e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
312f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
31300 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
31310 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
31320 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
31330 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
31340 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
31350 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
31360 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
31370 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
31380 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31390 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
313a0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
313b0 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
313c0 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
313d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
313e0 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
313f0 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
31400 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
31410 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
31420 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
31430 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
31440 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
31450 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
31460 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
31470 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
31480 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
31490 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
314a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
314b0 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
314c0 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
314d0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
314e0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
314f0 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
31500 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
31510 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
31520 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
31530 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
31540 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
31550 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
31560 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
31570 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
31580 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
31590 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
315a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
315b0 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
315c0 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
315d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
315e0 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
315f0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
31600 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
31610 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
31620 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
31630 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
31640 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
31650 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
31660 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
31670 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
31680 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
31690 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
316a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
316b0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
316c0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
316d0 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
316e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
316f0 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
31700 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
31710 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
31720 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
31730 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
31740 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
31750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31760 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
31770 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
31780 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
31790 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
317a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
317b0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
317c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
317d0 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
317e0 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
317f0 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
31800 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
31810 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
31820 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
31830 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
31840 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
31850 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
31860 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
31870 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
31880 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
31890 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
318a0 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20  e access mode.  
318b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
318c0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
318d0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
318e0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  he)==0 );.  asse
318f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
31900 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
31910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31920 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31930 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
31940 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31950 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
31960 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
31970 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
31980 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
31990 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
319a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
319b0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
319c0 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e     int bHotJourn
319d0 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  al = 1;         
319e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
319f0 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a  e exists a hot j
31a00 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a  ournal-file */..
31a10 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
31a20 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
31a30 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
31a40 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
31a50 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
31a60 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72  E_LOCK );..    r
31a70 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
31a80 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
31a90 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
31aa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
31ac0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
31ad0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
31ae0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
31af0 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
31b00 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31b10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
31b20 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31b30 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
31b40 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
31b50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
31b60 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
31b70 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
31b80 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
31b90 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
31ba0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
31bb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
31bc0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
31bd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
31be0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
31bf0 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
31c00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
31c10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31c20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
31c30 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
31c40 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
31c50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
31c60 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
31c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31c80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
31c90 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
31ca0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31cb0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
31cc0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
31cd0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31ce0 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
31cf0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
31d00 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
31d10 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
31d20 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
31d30 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
31d40 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
31d50 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
31d60 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
31d70 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
31d80 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
31d90 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
31da0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
31db0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
31dc0 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
31dd0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31de0 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
31df0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
31e00 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
31e10 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
31e20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
31e30 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
31e40 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
31e50 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
31e60 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
31e70 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
31e80 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
31e90 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
31ea0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
31eb0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31ec0 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31ed0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31ee0 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
31ef0 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
31f00 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
31f10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
31f20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
31f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
31f40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31f50 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
31f60 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
31f70 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
31f80 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
31f90 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
31fa0 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
31fb0 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31fc0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31fd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31fe0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31ff0 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
32000 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
32010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
32030 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
32040 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
32050 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
32060 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
32070 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
32080 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
32090 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
320a0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
320b0 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
320c0 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
320d0 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
320e0 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
320f0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
32100 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
32110 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
32120 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
32130 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
32140 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
32150 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
32160 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
32170 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
32180 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
32190 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
321a0 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
321b0 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
321c0 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
321d0 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
321e0 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
321f0 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
32200 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
32210 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
32220 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
32230 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
32240 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
32250 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
32260 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
32270 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
32280 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
32290 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
322a0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
322b0 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
322c0 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
322d0 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
322e0 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
322f0 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
32300 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
32310 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
32320 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
32330 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
32340 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
32350 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
32360 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
32370 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
32390 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
323a0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
323b0 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
323c0 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
323d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
323e0 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
323f0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
32400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
32410 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
32420 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
32430 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
32440 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
32450 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
32460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32470 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
32480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
32490 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
324a0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
324b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
324c0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
324d0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
324e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
324f0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
32500 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
32510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
32520 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
32530 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
32540 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
32550 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
32560 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
32570 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
32580 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
32590 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
325a0 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
325b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
325c0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
325d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
325e0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
325f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
32600 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
32610 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
32620 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
32630 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
32640 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
32650 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
32660 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
32670 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
32680 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
32690 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
326a0 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
326b0 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
326c0 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
326d0 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
326e0 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
326f0 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
32700 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
32710 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
32720 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
32730 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
32740 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
32750 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
32760 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
32770 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
32780 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
32790 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
327a0 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
327b0 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
327c0 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
327d0 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
327e0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
327f0 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
32800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32810 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
32820 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
32830 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32840 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
32850 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
32860 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
32870 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
32880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32890 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
328a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
328b0 70 50 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d  pPager, !pPager-
328c0 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
328d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
328e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
328f0 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
32900 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
32910 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32920 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
32930 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
32940 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
32950 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
32960 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32970 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
32980 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
32990 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
329a0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
329b0 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
329c0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
329d0 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
329e0 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
329f0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
32a00 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
32a10 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
32a20 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
32a30 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
32a40 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
32a50 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
32a60 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
32a70 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
32a80 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
32a90 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
32aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
32ab0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
32ac0 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
32ad0 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
32ae0 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
32af0 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
32b00 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
32b10 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
32b20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
32b30 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
32b40 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
32b50 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
32b60 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
32b70 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
32b80 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
32b90 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
32ba0 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
32bb0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
32bc0 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
32bd0 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
32be0 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
32bf0 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
32c00 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
32c10 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
32c20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
32c30 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
32c40 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
32c50 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
32c60 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
32c70 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
32c80 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
32c90 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
32ca0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
32cb0 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
32cc0 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
32cd0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
32ce0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
32cf0 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
32d00 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
32d10 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
32d20 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
32d30 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
32d40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32d50 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
32d60 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
32d70 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32d80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
32d90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32da0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32db0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32dc0 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
32dd0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
32de0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
32df0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32e00 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
32e10 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
32e20 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
32e30 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
32e40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70  r->tempFile && p
32e50 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
32e60 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  aredLock ){.    
32e70 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
32e80 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
32e90 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e  en acquired then
32ea0 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   check to.      
32eb0 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61  ** see if the da
32ec0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
32ed0 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
32ee0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
32ef0 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a  hanged,.      **
32f00 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
32f10 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68  .  The hasHeldSh
32f20 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72  aredLock flag pr
32f30 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d  events this from
32f40 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
32f50 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20  ing on the very 
32f60 66 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20  first access to 
32f70 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72  a file, in order
32f80 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20   to save a.     
32f90 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63   ** single unnec
32fa0 65 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73  essary sqlite3Os
32fb0 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74  Read() call at t
32fc0 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20  he start-up..   
32fd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
32fe0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
32ff0 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
33000 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
33010 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
33020 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
33030 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
33040 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
33050 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
33060 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
33070 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
33080 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
33090 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
330a0 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
330b0 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
330c0 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
330d0 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
330e0 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
330f0 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
33100 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
33110 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
33120 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
33130 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
33140 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
33150 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
33160 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
33170 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
33180 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
33190 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
331a0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
331b0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
331c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
331d0 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
331e0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
331f0 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20  ileVers)];..    
33200 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
33210 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
33220 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
33230 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
33240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
33250 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
33260 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
33270 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
33280 20 32 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20   24);.      if( 
33290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
332a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
332b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
332c0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
332d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
332e0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
332f0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
33300 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
33310 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
33320 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
33330 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
33340 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
33350 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
33360 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
33370 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
33380 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
33390 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d  ..        /* Unm
333a0 61 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ap the database 
333b0 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73  file. It is poss
333c0 69 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e  ible that extern
333d0 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20  al processes.   
333e0 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65       ** may have
333f0 20 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64   truncated the d
33400 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
33410 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69   then extended i
33420 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a  t back.        *
33430 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  * to its origina
33440 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69  l size while thi
33450 73 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f  s process was no
33460 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  t holding a lock
33470 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
33480 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
33490 6d 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65  may exist a Page
334a0 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74  r.pMap mapping t
334b0 68 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20  hat appears.    
334c0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65      ** to be the
334d0 20 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20   right size but 
334e0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
334f0 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69  valid. Avoid thi
33500 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  s.        ** pos
33510 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61  sibility by unma
33520 70 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72  pping the db her
33530 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  e. */.        if
33540 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
33550 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
33560 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
33570 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
33580 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
33590 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
335a0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
335b0 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68  a WAL file in th
335c0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f  e file-system, o
335d0 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73  pen this databas
335e0 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20  e in WAL.    ** 
335f0 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  mode. Otherwise,
33600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
33610 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20  unction call is 
33620 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
33630 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
33640 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70  enWalIfPresent(p
33650 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20  Pager);.#ifndef 
33660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
33670 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33680 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72  er->pWal==0 || r
33690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
336a0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
336b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
336c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
336d0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
336e0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
336f0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
33700 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
33710 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
33720 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
33730 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
33740 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
33750 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
33760 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
33770 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
33780 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
33790 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
337a0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
337b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
337c0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
337d0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
337e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
337f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33800 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
33810 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
33820 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
33830 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
33840 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48      pPager->hasH
33850 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20  eldSharedLock = 
33860 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
33870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
33880 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
33890 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
338a0 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
338b0 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
338c0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
338d0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
338e0 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
338f0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
33900 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
33910 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
33920 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
33930 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
33940 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
33950 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
33960 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
33970 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
33980 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
33990 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
339a0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
339b0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
339c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
339d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  f( pPager->nMmap
339e0 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74  Out==0 && (sqlit
339f0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
33a00 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33a10 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
33a20 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
33a30 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
33a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
33a50 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
33a60 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63  s each try to ac
33a70 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
33a80 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77  e to a.** page w
33a90 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ith page number 
33aa0 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71  pgno. If the req
33ab0 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
33ac0 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
33ad0 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
33ae0 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
33af0 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
33b00 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
33b10 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64  *.** There are d
33b20 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65  ifferent impleme
33b30 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
33b40 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65  getter method de
33b50 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
33b60 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
33b70 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  of the pager..**
33b80 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e  .**     getPageN
33b90 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20  ormal()         
33ba0 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67  --  The normal g
33bb0 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74  etter.**     get
33bc0 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20  PageError()     
33bd0 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66       --  Used if
33be0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
33bf0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a   an error state.
33c00 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d  **     getPageMm
33c10 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d  ap()           -
33c20 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72  -  Used if memor
33c30 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
33c40 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66  enabled.**.** If
33c50 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
33c60 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
33c70 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
33c80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
33c90 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
33ca0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
33cb0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
33cc0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
33cd0 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
33ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33cf0 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
33d00 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
33d10 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
33d20 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
33d30 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
33d40 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
33d50 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
33d60 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
33d70 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
33d80 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
33d90 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
33da0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
33db0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
33dc0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
33dd0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
33de0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
33df0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
33e00 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
33e10 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
33e20 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
33e30 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
33e40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
33e50 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
33e60 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
33e70 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
33e80 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
33e90 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
33ea0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
33eb0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
33ec0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
33ed0 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
33ee0 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20  f .** the flags 
33ef0 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
33f00 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  ns the PAGER_GET
33f10 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61  _NOCONTENT bit a
33f20 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
33f30 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
33f40 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
33f50 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
33f60 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
33f70 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
33f80 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
33f90 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
33fa0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
33fb0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
33fc0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
33fd0 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
33fe0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
33ff0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
34000 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
34010 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
34020 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
34030 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
34040 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
34050 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
34060 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
34070 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
34080 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
34090 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
340a0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
340b0 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
340c0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
340d0 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
340e0 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
340f0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
34100 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
34110 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
34120 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
34130 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
34140 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  l..**.** If PAGE
34150 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34160 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
34170 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
34180 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
34190 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65  d.** of being re
341a0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
341b0 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
341c0 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
341d0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
341e0 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
341f0 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
34200 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
34210 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
34220 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
34230 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
34240 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
34250 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
34260 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
34270 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
34280 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
34290 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
342a0 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
342b0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
342c0 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
342d0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
342e0 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
342f0 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
34300 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
34310 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
34320 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
34330 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
34340 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
34350 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
34360 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
34370 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
34380 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
34390 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
343a0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
343b0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
343c0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
343d0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
343e0 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
343f0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
34400 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
34410 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
34420 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
34430 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
34440 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
34450 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
34460 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
34470 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
34480 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
34490 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
344a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
344b0 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
344c0 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
344d0 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
344e0 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
344f0 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
34500 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
34510 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
34520 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
34530 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
34540 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
34550 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
34560 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
34570 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  rnal files..*/.s
34580 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
34590 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72  eNormal(.  Pager
345a0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
345b0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
345c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
345d0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
345e0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
345f0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
34600 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
34610 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
34620 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
34630 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
34640 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
34650 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
34660 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
34670 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
34680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34690 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
346a0 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20  u8 noContent;   
346b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346c0 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52  /* True if PAGER
346d0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
346e0 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74  s set */.  sqlit
346f0 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
34700 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74  pBase;..  assert
34710 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
34720 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
34730 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34740 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34750 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
34760 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
34770 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
34780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34790 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
347a0 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69  dLock==1 );..  i
347b0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
347c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
347d0 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
347e0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
347f0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
34800 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
34810 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
34820 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
34830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34840 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
34850 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
34860 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
34870 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34880 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34890 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
348a0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
348b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
348c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
348d0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
348e0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
348f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
34900 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
34910 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34920 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
34930 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
34940 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
34950 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
34960 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
34970 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
34980 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
34990 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
349a0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
349b0 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
349c0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
349d0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
349e0 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
349f0 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
34a00 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
34a10 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
34a20 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
34a30 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
34a40 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
34a50 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
34a60 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
34a70 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
34a80 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
34a90 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
34aa0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
34ab0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
34ac0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
34ad0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
34ae0 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
34af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
34b00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
34b10 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
34b20 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
34b30 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
34b40 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
34b50 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
34b60 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
34b70 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
34b80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
34b90 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
34ba0 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
34bb0 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
34bc0 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
34bd0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
34be0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
34bf0 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
34c00 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
34c10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
34c20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
34c30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34c40 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
34c50 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34c60 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
34c70 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
34c80 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
34c90 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
34ca0 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
34cb0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
34cc0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
34cd0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
34ce0 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
34cf0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
34d00 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
34d10 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
34d20 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
34d30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34d40 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
34d60 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
34d70 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
34d80 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
34d90 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
34da0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
34db0 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
34dc0 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
34dd0 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
34de0 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
34df0 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
34e00 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
34e10 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
34e20 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
34e30 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
34e40 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
34e50 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
34e60 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
34e70 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
34e80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
34e90 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
34ea0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
34eb0 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
34ec0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34ed0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
34ee0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
34ef0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
34f00 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
34f10 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
34f20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
34f30 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
34f40 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
34f50 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
34f60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34f70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34f80 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
34f90 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
34fa0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
34fb0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
34fc0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
34fd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34fe0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34ff0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35000 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
35010 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
35020 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
35030 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
35040 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
35050 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
35060 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
35070 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
35080 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
35090 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  iFrame = 0;     
350a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
350b0 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f  rame to read fro
350c0 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  m WAL file */.  
350d0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
350e0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
350f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35100 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
35110 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
35120 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
35130 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35140 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
35150 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35170 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
35180 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
35190 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
351a0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
351b0 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
351c0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
351d0 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
351e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
351f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
35200 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35210 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
35220 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
35230 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
35240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
35250 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
35260 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
35270 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
35280 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
35290 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
352a0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
352b0 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
352c0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
352d0 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  r);.  *ppPage = 
352e0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
352f0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
35300 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
35310 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72   The page getter
35320 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f 72 79   for when memory
35330 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65  -mapped I/O is e
35340 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63  nabled */.static
35350 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70   int getPageMMap
35360 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
35370 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
35380 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
35390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
353a0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
353b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
353c0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
353d0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
353e0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
353f0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
35400 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
35410 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
35420 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
35430 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
35440 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
35460 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32   *pPg = 0;.  u32
35470 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20   iFrame = 0;    
35480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35490 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72  Frame to read fr
354a0 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a  om WAL file */..
354b0 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70    /* It is accep
354c0 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72  table to use a r
354d0 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20  ead-only (mmap) 
354e0 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67  page for any pag
354f0 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61  e except.  ** pa
35500 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73  ge 1 if there is
35510 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
35520 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68  ction open or th
35530 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e  e ACQUIRE_READON
35540 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73  LY.  ** flag was
35550 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
35560 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f  e caller. And so
35570 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20   long as the db 
35580 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74  is not a .  ** t
35590 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
355a0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
355b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
355c0 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e  bMmapOk = (pgno>
355d0 31 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  1.   && (pPager-
355e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
355f0 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20  EADER || (flags 
35600 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  & PAGER_GET_READ
35610 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61  ONLY)).  );..  a
35620 73 73 65 72 74 28 20 55 53 45 46 45 54 43 48 28  ssert( USEFETCH(
35630 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 64 65  pPager) );.#ifde
35640 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
35650 45 43 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  EC.  assert( pPa
35660 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ger->xCodec==0 )
35670 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  ;.#endif..  /* O
35680 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65  ptimization note
35690 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22 70  :  Adding the "p
356a0 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66  gno<=1" term bef
356b0 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65  ore "pgno==0" he
356c0 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74  re.  ** allows t
356d0 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  he compiler opti
356e0 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74  mizer to reuse t
356f0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
35700 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20  e "pgno>1".  ** 
35710 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65 76  test in the prev
35720 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20  ious statement, 
35730 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e  and avoid testin
35740 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65  g pgno==0 in the
35750 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73  .  ** common cas
35760 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20  e where pgno is 
35770 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  large. */.  if( 
35780 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d  pgno<=1 && pgno=
35790 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
357a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
357b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
357c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
357d0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
357e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
357f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
35800 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
35810 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61  sert( pPager->ha
35820 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d  sHeldSharedLock=
35830 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
35840 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
35850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
35860 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
35870 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
35880 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
35890 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
358a0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
358b0 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
358c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
358d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
358e0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
358f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35900 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
35910 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65  MmapOk && iFrame
35920 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ==0 ){.    void 
35930 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  *pData = 0;.    
35940 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65  rc = sqlite3OsFe
35950 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
35960 0a 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70  .        (i64)(p
35970 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
35980 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65  >pageSize, pPage
35990 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44  r->pageSize, &pD
359a0 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ata.    );.    i
359b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
359c0 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20   && pData ){.   
359d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
359e0 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44  State>PAGER_READ
359f0 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  ER || pPager->te
35a00 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
35a10 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
35a20 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
35a30 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
35a40 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  }.      if( pPg=
35a50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
35a60 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 4d   = pagerAcquireM
35a70 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  apPage(pPager, p
35a80 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67  gno, pData, &pPg
35a90 29 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  );.     }else{. 
35aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
35ab0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
35ac0 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
35ad0 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
35ae0 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
35af0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
35b00 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  g ){.        ass
35b10 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
35b20 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  OK );.        *p
35b30 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20  pPage = pPg;.   
35b40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35b50 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
35b60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
35b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35b80 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
35b90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
35ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
35bb0 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f 72 6d  turn getPageNorm
35bc0 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  al(pPager, pgno,
35bd0 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
35be0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
35bf0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
35c00 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 70  E>0 */../* The p
35c10 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f  age getter metho
35c20 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65 20 70  d for when the p
35c30 61 67 65 72 20 69 73 20 61 6e 20 65 72 72 6f 72  ager is an error
35c40 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74 69 63   state */.static
35c50 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f   int getPageErro
35c60 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
35c70 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
35c80 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
35c90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35ca0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
35cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35cc0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
35cd0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
35ce0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
35cf0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
35d00 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
35d10 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
35d20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
35d30 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
35d40 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
35d50 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a 20 20  AMETER(pgno);.  
35d60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35d70 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73 65 72  (flags);.  asser
35d80 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
35d90 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
35da0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
35db0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
35dc0 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a  >errCode;.}.../*
35dd0 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20 70 61   Dispatch all pa
35de0 67 65 20 66 65 74 63 68 20 72 65 71 75 65 73 74  ge fetch request
35df0 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  s to the appropr
35e00 69 61 74 65 20 67 65 74 74 65 72 20 6d 65 74 68  iate getter meth
35e10 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  od..*/.int sqlit
35e20 65 33 50 61 67 65 72 47 65 74 28 0a 20 20 50 61  e3PagerGet(.  Pa
35e30 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
35e40 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
35e50 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
35e60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
35e70 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
35e80 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
35e90 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
35ea0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
35eb0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
35ec0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
35ed0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
35ee0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
35ef0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
35f00 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 72   flags */.){.  r
35f10 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 78 47  eturn pPager->xG
35f20 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
35f30 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
35f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
35f50 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
35f60 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
35f70 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
35f80 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
35f90 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
35fa0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
35fb0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
35fc0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
35fd0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
35fe0 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
35ff0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
36000 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
36010 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
36020 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
36030 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
36040 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
36050 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
36060 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
36070 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
36080 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
36090 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
360a0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
360b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
360c0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
360d0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
360e0 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
360f0 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
36100 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
36110 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
36120 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
36130 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
36140 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71  Pgno pgno){.  sq
36150 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
36160 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
36170 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
36180 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
36190 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
361a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
361b0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
361c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
361d0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
361e0 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  he, pgno, 0);.  
361f0 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30  assert( pPage==0
36200 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48   || pPager->hasH
36210 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b  eldSharedLock );
36220 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
36230 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
36240 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
36250 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
36260 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
36270 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a  gno, pPage);.}..
36280 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
36290 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
362a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
362b0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
362c0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
362d0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
362e0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
362f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
36300 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
36310 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
36320 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
36330 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
36340 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
36350 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
36360 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
36370 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
36380 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36390 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
363a0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
363b0 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
363c0 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPg!=0 );.  pP
363d0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
363e0 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  er;.  if( pPg->f
363f0 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
36400 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65  P ){.    pagerRe
36410 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
36420 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36430 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
36440 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
36450 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
36460 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
36470 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
36480 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
36490 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
364a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
364b0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
364c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
364d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
364e0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
364f0 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
36500 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
36510 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
36520 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
36530 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
36540 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36550 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
36560 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
36570 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
36580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36590 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
365a0 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
365b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
365c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
365d0 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
365e0 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
365f0 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
36600 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
36610 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
36620 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
36630 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
36640 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
36650 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
36660 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
36670 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
36680 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
36690 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
366a0 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
366b0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
366c0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
366d0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
366e0 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
366f0 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
36700 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
36710 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
36720 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
36730 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
36740 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
36750 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
36760 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
36770 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
36780 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
36790 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
367a0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
367b0 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
367c0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
367d0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
367e0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
367f0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
36800 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
36810 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
36820 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
36830 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
36840 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
36850 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
36860 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
36870 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
36880 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
36890 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
368a0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
368b0 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
368c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
368d0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
368e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
368f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36900 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
36910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36920 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
36930 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
36940 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
36950 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
36960 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
36970 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
36980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36990 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
369a0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
369b0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
369c0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
369d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
369e0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
369f0 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
36a00 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
36a10 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
36a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36a30 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
36a40 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
36a50 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
36a60 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
36a70 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
36a80 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
36a90 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
36aa0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36ab0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
36ac0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
36ad0 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
36ae0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
36af0 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
36b00 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
36b10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
36b20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
36b30 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
36b40 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
36b50 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
36b60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
36b70 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
36b80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
36b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
36ba0 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
36bb0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
36bc0 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
36bd0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
36be0 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
36bf0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
36c00 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
36c10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36c20 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
36c30 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
36c40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36c50 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
36c60 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
36c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36c80 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
36c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
36ca0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
36cb0 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20  _CREATE;.       
36cc0 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20   int nSpill;..  
36cd0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
36ce0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
36cf0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
36d00 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
36d10 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
36d20 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
36d30 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  RNAL);.         
36d40 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65   nSpill = sqlite
36d50 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
36d60 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
36d70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  e{.          fla
36d80 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
36d90 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
36da0 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
36db0 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a   = jrnlBufferSiz
36dc0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
36dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a     }.          .
36de0 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
36df0 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
36e00 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68  ase still has th
36e10 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69  e same name as i
36e20 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20  t did when.     
36e30 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69     ** it was ori
36e40 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20  ginally opened. 
36e50 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
36e60 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
36e70 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  d(pPager);.     
36e80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
36eb0 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20  urnalOpen (.    
36ec0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
36ed0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
36ee0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
36ef0 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20  lags, nSpill.   
36f00 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
36f10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36f20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
36f30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
36f40 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
36f50 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
36f60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
36f70 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
36f80 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
36f90 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
36fa0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
36fb0 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
36fc0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
36fd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
36ff0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
37000 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
37010 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
37020 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
37030 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
37040 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
37050 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
37060 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
37070 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
37080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
37090 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
370a0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
370b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
370c0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
370d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
370e0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
370f0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
37100 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
37110 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
37120 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
37130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37140 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37150 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
37160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
37170 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
37180 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
37190 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
371a0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
371b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
371c0 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
371d0 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
371e0 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
371f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
37200 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
37210 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
37220 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
37230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
37240 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
37250 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
37260 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
37270 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
37280 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
37290 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
372a0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
372b0 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
372c0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
372d0 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
372e0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
372f0 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
37300 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
37310 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
37320 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
37330 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
37340 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
37350 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
37360 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
37370 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
37380 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
37390 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
373a0 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
373b0 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
373c0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
373d0 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
373e0 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
373f0 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
37400 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
37410 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
37420 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
37430 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
37440 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
37450 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
37460 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
37470 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
37480 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
37490 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
374a0 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
374b0 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
374c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
374d0 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
374e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
374f0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
37500 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
37510 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
37520 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
37530 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
37540 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37550 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
37560 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
37570 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
37580 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
37590 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
375a0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
375b0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
375c0 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
375d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
375e0 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
375f0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
37600 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
37610 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37620 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
37630 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
37640 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
37650 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
37660 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
37670 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
37680 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
37690 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
376a0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
376b0 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
376c0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
376d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
376e0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
376f0 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
37700 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
37710 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
37720 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
37730 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
37740 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
37750 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
37760 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
37770 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
37780 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
37790 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
377a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
377b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
377c0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
377d0 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
377e0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
377f0 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
37800 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
37810 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
37820 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
37830 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
37840 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
37850 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
37860 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
37870 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
37880 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
37890 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
378a0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
378b0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
378c0 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
378d0 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
378e0 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
378f0 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
37900 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
37910 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
37920 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
37930 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
37940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37950 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
37960 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
37970 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
37980 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
37990 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
379a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
379b0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
379c0 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
379d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
379e0 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
379f0 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
37a00 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
37a10 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
37a20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
37a30 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
37a40 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
37a50 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
37a60 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
37a70 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
37a80 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
37a90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
37aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
37ab0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
37ac0 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
37ad0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
37ae0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
37af0 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
37b00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
37b10 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
37b20 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
37b30 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
37b40 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
37b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37b60 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
37b70 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
37b80 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
37b90 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
37ba0 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
37bb0 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
37bc0 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
37bd0 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
37be0 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
37bf0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
37c00 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
37c10 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
37c20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
37c30 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
37c40 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
37c50 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
37c60 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
37c70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
37c80 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
37c90 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
37ca0 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
37cb0 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
37cc0 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
37cd0 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
37ce0 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
37cf0 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
37d00 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
37d10 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
37d20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
37d30 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
37d40 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
37d50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
37d60 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
37d70 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
37d80 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
37d90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
37da0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
37db0 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
37dc0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
37dd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37de0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
37df0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
37e00 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
37e10 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37e20 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
37e30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
37e40 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
37e50 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37e60 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
37e70 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
37e80 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37e90 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
37ea0 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
37eb0 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
37ec0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
37ed0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
37ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70  }../*.** Write p
37ef0 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65  age pPg onto the
37f00 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c   end of the roll
37f10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
37f20 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
37f30 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
37f40 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
37f50 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  ckJournal(PgHdr 
37f60 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
37f70 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
37f80 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
37f90 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63    u32 cksum;.  c
37fa0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69  har *pData2;.  i
37fb0 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
37fc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
37fd0 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
37fe0 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
37ff0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
38000 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a  e page that.  **
38010 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
38020 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
38030 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
38040 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a  ert verifies.  *
38050 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
38060 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
38070 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
38080 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
38090 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
380a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
380b0 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
380c0 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32  lOff );.  CODEC2
380d0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
380e0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
380f0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
38100 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
38110 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20  ta2);.  cksum = 
38120 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
38130 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
38140 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20  ;..  /* Even if 
38150 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
38160 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
38170 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
38180 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
38190 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
381a0 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
381b0 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
381c0 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68  e page..  ** Oth
381d0 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
381e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
381f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
38200 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70   logic in.  ** p
38210 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
38220 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
38230 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
38240 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
38250 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  .  ** in the dat
38260 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
38270 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
38280 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
38290 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  g so,.  ** then 
382a0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
382b0 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  ollow..  */.  pP
382c0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
382d0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
382e0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
382f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
38300 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
38310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38320 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
38330 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
38340 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
38350 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
38360 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
38370 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  ff+4);.  if( rc!
38380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
38390 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77  urn rc;.  rc = w
383a0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
383b0 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
383c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
383d0 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72   cksum);.  if( r
383e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
383f0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54  eturn rc;..  IOT
38400 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
38410 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
38420 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
38430 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61   .           pPa
38440 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
38450 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
38460 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  e));.  PAGER_INC
38470 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
38480 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
38490 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
384a0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
384b0 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
384c0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
384d0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
384e0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
384f0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
38500 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
38510 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
38520 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
38530 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
38540 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
38550 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
38560 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b  .  pPager->nRec+
38570 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  +;.  assert( pPa
38580 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
38590 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
385a0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
385b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
385c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
385d0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
385e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
385f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
38600 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
38610 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
38620 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
38630 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
38640 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
38650 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
38660 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
38670 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
38680 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38690 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
386a0 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
386b0 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
386c0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
386d0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
386e0 6a 6f 75 72 6e